2010-12-30 16 views
6

Ho un problema molto strano stiamo usando jpa 2.0 con le annotazioni di ibernazione basate Il database generato tramite JPA DDL è true e MySQL come Database;JPA 2.0 Provider Hibernate

fornirò alcune classi di riferimento e quindi il mio simbolo.

@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 

} 

come nel codice si può vedere che i genitori e le classi bambino estende la classe comune in modo entrambi hanno proprietà indirizzo e l'ID, il problema si verifica quando il cambiamento del refference indirizzo in classe genitore riflettono stesso cambiamento di tutti gli oggetti figlio in lista e se l'indirizzo del cambiamento refference in classe figlia poi unire cambierà indirizzo refference del genitore così

io non sono in grado di capire è che è problema di APP o sospensione

+1

C'è un po 'di informazioni sulla mappatura mancante qui. Stai tentando di mappare l'ereditarietà o hai solo ciò che separa la tabella PARENT e le tabelle CHILD con struttura simile? Puoi includere le annotazioni a livello di classe (@Entity ecc.) Come le hai. –

+0

Rimossi i riferimenti a Spring MVC, poiché non è rilevante e confonde il problema. – skaffman

+0

grazie Davis sì, ho dimenticato di mettere queste annotazioni, in realtà sto avendo una tabella separata per genitore e figlio con i campi della classe ereditata comune. la cosa che non riesco a capire è perché cambia il riferimento di child-> address in parent. quando cambio semplicemente il riferimento dell'indirizzo per il genitore – Rooh

risposta

1

Se avete istanze di indirizzo condiviso , le modifiche apportate quando è nella "portata" di un bambino influisce sul genitore, perché tu si occupano della stessa istanza di indirizzo nell'oggetto padre.

Per esempio:

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

In questo caso, se si cambia Child3.address.street, vuol dire che è cambiato anche Parent1.address.street. Si noti che ciò che rende l'indirizzo in Parent1 e Child3 lo stesso è l'ID. Se hanno lo stesso ID, sono la stessa istanza (cioè: "condivisa" tra entrambi gli oggetti).

+0

partenon il suo oggetto non condiviso padre ha il proprio indirizzo e l'oggetto chlid ha il proprio indirizzo. in modo che gli oggetti siano oggetti diversi e non condivisi, basta posizionarli nella classe comune a causa della gestione del codice, anche se ho inserito l'indirizzo nella classe di differenze rimuovendo la classe comune e inserendo la proprietà dell'indirizzo in parent e child.may ci sono problemi con EntityManager – Rooh

Problemi correlati