2010-12-30 35 views
6

Tengo un problema muy extraño que estamos utilizando jpa 2.0 con anotaciones de hibernación basadas en Base de datos generada a través de JPA DDL es verdadera y MySQL como base de datos;proveedor JPA 2.0 Hibernate

proporcionaré algunas clases de referencia y luego mi porblema.

@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 

} 

como en el código se puede ver que los padres y las clases hijas se extiende clase común por lo tanto tienen la propiedad de dirección y de identificación, el problema se produce cuando el cambio del refference dirección en la clase padre que reflejan mismo cambio en todos los objetos secundarios en la lista y si la dirección de cambio refference en la clase del niño y luego fusionar el que va a cambiar la dirección refference de los padres, así

no soy capaz de averiguar es que es problema de la APP o hibernación

+1

Falta aquí un poco de información de mapeo. ¿Está intentando mapear la herencia o simplemente qué separa la tabla de PADRES y las tablas de NIÑOS con una estructura similar? ¿Puedes incluir las anotaciones de nivel de clase (@Entity, etc.) tal como las tienes? –

+0

Se eliminaron las referencias a Spring MVC, ya que no es relevante y se confunde el problema. – skaffman

+0

gracias Davis sí me olvidé de colocar estas anotaciones, en realidad estoy teniendo una tabla separada para padres e hijos con campos heredados de clases comunes. Lo que no puedo entender es por qué cambia la referencia de child-> address en parent. cuando solo cambio la referencia de dirección para el padre – Rooh

Respuesta

1

Si usted ha compartido casos de dirección , los cambios realizados cuando están en el "alcance" de un niño sí afectan al padre, porque usted están tratando con la misma instancia de dirección en el objeto principal.

Por ejemplo:

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

En este caso, si cambia Child3.address.street, significa que también cambió Parent1.address.street. Tenga en cuenta que lo que hace que la dirección en Parent1 y Child3 sea la misma es la ID. Si tienen la misma ID, son la misma instancia (es decir: "compartida" entre ambos objetos).

+0

partenon its not shared object parent tiene su propia dirección y el objeto chlid tiene su propia dirección. para que los objetos sean diferentes no sean objetos compartidos, solo coloque en clase común debido a la administración del código, incluso coloque la dirección en la clase de diferencia eliminando la clase común y colocando la propiedad de dirección en principal y secundario. Puede haber algún problema con EntityManager – Rooh

Cuestiones relacionadas