Lo obtiene porque intenta persistir un objeto que ya existe (la misma ID). Su cascada probablemente no persista es MERGE/UPDATE/REMOVE/DETACH. La mejor forma de evitar esta situación es configurar la cascada correctamente o administrar las cascadas manualmente. Básicamente hablando, la cascada persiste es el culpable habitual.
Es probable quieren algo como esto:
//SomeService--I assume you create ID's on persist
saveChild(Parent parent, Child child)
{
//Adding manually (using your cascade ALL)
if(child.getId() == null) //I don't exist persist
persistence.persist(child);
else
persistence.merge(child); //I'm already in the DB, don't recreate me
parent.setChild(child);
saveParent(parent); //using a similar "don't duplicate me" approach.
}
Las cascadas pueden ser extremadamente frustrante si usted deja el marco manejarlo, ya que tendrá en ocasiones se pierde actualizaciones si es el almacenamiento en caché (en particular con colecciones en ManyToOne relaciones). Si no guarda explícitamente el elemento primario y permite que el marco se ocupe de las cascadas. En términos generales, concedo Cascade.ALL a mis padres en una relación y cascada de DELETE/PERSIST de mis hijos. Soy un usuario de Eclipselink, por lo que mi experiencia con Hibernate/other es limitada y no puedo hablar con el almacenamiento en caché. * Realmente, piénselo: si está guardando un niño, ¿realmente desea guardar todos los objetos relacionados con él? Además, si está agregando un niño, ¿no debería notificar a los padres? *
En su caso, simplemente tendría un método "saveParent" y "saveChild" en mi Dao/Servicio que garantizara que el caché sea correcto y la base de datos sea correcta para evitar el dolor de cabeza. Administrar manualmente significa que tendrá control absoluto y no tendrá que depender de las cascadas para hacer su trabajo sucio. En una sola dirección, son fantásticos, en el momento en que lleguen "aguas arriba" vas a tener comportamientos inesperados.
¿Estás seguro de que tu modelo está bien? El niño puede tener muchos padres y el padre solo puede tener un hijo. –
Mi respuesta asume una relación OneToOne: el comentario anterior es absolutamente correcto, es un nombre extraño si es correcto. –
Sí, el modelo es correcto. Cambié el nombre de las entidades por el ejemplo, y parece que podría haberlo hecho mejor. – Cos64