2011-10-27 34 views
6

Tengo problemas en la persistencia del campo OneToMany. Estas son dos clases simplificadas que estoy usando para hacer la prueba.Jpa OneToMany no persistir hijo

public class User implements Serializable { 
... 
private String name; 
... 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
private List<PhoneNumber> phoneNumbers; 
... 
} 

public class PhoneNumber implements Serializable { 
... 
private String phoneNumber; 
... 
@ManyToOne() 
private User user; 
... 
} 

por lo que quiero hacer esto:

User u = new User(); 
PhoneNumber p = new PhoneNumber(); 
u.setName("Alan"); 
u.getPhoneNumbers.add(p); 

Pero cuando persisto el usuario u phoneNumber el niño no se conserva automáticamente. De manera OO, solo necesito hacer una composición de uno a muchos.

Uso EclipseLink.

Muchas gracias a todos por sus sugerencias.

+0

Es un poco extraño - un ejemplo funciona bien en mi caso (EclipseLink). Al final, solo hace que EntityManager # persist (u)? ¿Cómo sabe que el valor no se mantiene? ¿Verificó en la base de datos o consultó a la entidad de alguna manera? ¿Intentó enjuagar el EntityManager? –

Respuesta

2

Debe establecer la relación en ambas direcciones. Añadir p.setUser(u) a su código:

User u = new User(); 
PhoneNumber p = new PhoneNumber(); 
u.setName("Alan"); 
u.getPhoneNumbers.add(p); 
p.setUser(u); 
+0

¿Está seguro de que debe establecer ambas direcciones para que persista la entidad PhoneNumber? –

+0

@Pedro Si se trata de una relación bidireccional (como se muestra en el fragmento de código de la pregunta): Sí. –

+2

¿es porque PhoneNumber es un lado invertido de la relación? He persistido con éxito la estructura mencionada anteriormente sin establecer el segundo lado de la relación. PhoneNumeber.user está configurado como nulo, pero persiste correctamente. Eche un vistazo a la especificación JPA 2.0 3.2.4 "Las relaciones bidireccionales entre las entidades administradas se mantendrán en función de las referencias mantenidas por el lado propietario de la relación. Es responsabilidad del desarrollador mantener las referencias en memoria almacenadas en la propiedad. lado y los que se mantienen en el lado inverso coherentes entre sí cuando cambian " –

Cuestiones relacionadas