[EJB3] [JPA] TransientObjectException
bonjour a tous ,
voila j'ai un petit probleme avec les annotations JPA dans les EJB3.
ce que cherche a faire c'est une realtion many to one et one to many entre une entité personne et une entité ville
Une ville pouvant contenir plusieurs personnes et une personne ne pouvant appartenir a une seule ville .
j'ai donc defini mes relations de la maniere suivante :
person :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
@Entity
@Name("person")
@Table(name="Person")
public class Person implements Serializable {
private long id;
private String name;
private int age;
private String email;
private String comment;
private Ville ville;
[...] getter and setters[/...]
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "villeId")
public Ville getVille() { return ville; }
public void setVille(Ville ville) {
this.ville = ville;
}
} |
et ville :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
@Entity
@Name("ville")
@Table(name="Ville")
public class Ville implements Serializable {
private long id;
private String name;
private int cp ;
private String comment;
private Collection<Person> listePersons;
[...] getter and setters[/...]
@OneToMany(fetch = FetchType.LAZY, mappedBy="ville")
public Collection<Person> getPersons()
{
return listePersons;
}
public void setPersons(Collection<Person> listePersons)
{
this.listePersons = listePersons;
}
} |
ce que je cherche a faire dans cette application c'est de creer une personne , remplir quelque attribut et pouvoir lui affecter une ville présente en base de donnée
Lorsque j'esaie de faire persiter l'entité person et , si dans le Many To One de Person je ne definis pas l'attribut Cascade.PERSIST , j'ai une erreur de ce type
Code:
1 2 3
|
11:25:50,620 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@170bdf7
java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.evolutis.person.Person.ville -> com.evolutis.ville.Ville |
ce que j'ai compris c'est que JPA cherche a faire persisté la ville, ce que je ne veut pas puique cette ville est deja en base.
Si je definis Cascade.PERSIST alors tout se passe bien mais il essaie de dupliquer la ville qui existe deja.
quelqu'un aurait une idée ?
merci d'avance