2010-12-30 5 views
6

J'ai un problème très étrange que nous utilisons jpa 2.0 avec des annotations d'hibernation basées Base de données générée par JPA DDL est vrai et MySQL comme base de données; Je vais fournir quelques classes de référence et ensuite mon problème.JPA 2.0 Fournisseur Hibernate

@MappedSuperclass 
public abstract class Common implements serializable{ 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id", updatable = false) 
private Long id; 

@ManyToOne 
@JoinColumn 
private Address address; 
     //with all getter and setters 
     //as well equal and hashCode 

} 

@Entity 
public class Parent extends Common{ 
     private String name; 
     @OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, mappedBy = "parent") 
     private List<Child> child; 
     //setters and rest of class 
} 

@Entity 
public class Child extends Common{ 
//some properties with getter/setters 
} 

@Entity 
public class Address implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id", updatable = false) 
private Long id; 

     private String street; 
     //rest of class with get/setter 

} 

comme dans le code que vous pouvez voir que les parents et les classes d'enfants étend la classe commune si les deux ont l'adresse propriété et id, le problème se produit lorsque le changement de la refference d'adresse en classe parent, il reflète même changement dans tous les objets enfant dans la liste et si refference adresse de changement de classe enfant puis fusionner va changer l'adresse refference des parents et

je ne suis pas en mesure de comprendre est qu'il est problème de JPA ou mise en veille prolongée

+1

Il manque un peu d'informations de mappage ici. Essayez-vous de cartographier l'héritage ou vous juste ce que séparent table PARENT et tables enfant avec une structure similaire? Pouvez-vous inclure les annotations de niveau classe (@Entity etc) comme vous les avez. –

+0

Suppression des références à Spring MVC, car ce n'est pas pertinent, et confond le problème. – skaffman

+0

merci Davis oui j'ai oublié de placer ces annotations, en fait j'ai une table séparée pour parent et enfant avec des champs de la classe héritée commune. la chose que je n'arrive pas à comprendre c'est pourquoi elle change la référence de l'adresse enfant-> dans le parent. quand je viens de changer la référence de l'adresse pour le parent – Rooh

Répondre

1

Si vous avez partagé cas d'adresse , les modifications apportées quand il est dans la "portée" d'un enfant affecte le parent, parce que vous traitent la même instance Address dans l'objet parent.

Par exemple:

Parent1.address => Address #1 
Child1.address => Address #2 
Child2.address => Address #2 
Child3.address => Address #1 

Dans ce cas, si vous changez Child3.address.street, cela signifie qu'il a aussi changé Parent1.address.street. Notez que ce qui rend l'adresse dans Parent1 et Child3 identique est l'ID. S'ils ont le même ID, ils sont la même instance (ie: "partagé" entre les deux objets).

+0

partenon son objet non partagé parent a sa propre adresse et l'objet chlid a sa propre adresse. pour que les objets soient différents, pas de l'objet partagé, placez simplement dans la classe commune la gestion de code même j'ai placé l'adresse dans la classe de différence en supprimant la classe commune et plaçant la propriété d'adresse dans parent et child.may y a-t-il un problème avec EntityManager? – Rooh