Tengo este problema desde hace mucho tiempo, he buscado en la web y SO dentro y fuera y no he encontrado una solución todavía. Espero que me puedas ayudar en eso.Hibernate @OneToMany con mappedBy (padre-hijo) relación y problema de caché
que tienen una relación padre-hijo entre dos entidades como la siguiente:
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<Child> children = new HashSet<Child>();
// ...
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
// ...
}
Lo que pasa es que cuando se crea un nuevo hijo y asignarlo a un padre, el padre no se actualizan cuando ya está en el caché.
Parent parent = new Parent();
em.persist(parent);
// ...
Child child = new Child();
child.setParent(parent);
em.persist(child);
parent.getChildren().size(); // returns 0
me han tratado de utilizar @PreUpdate para añadir automáticamente al niño a los padres cuando se conserva el niño, pero en el caso cuando tenemos 2 gestores de entidad en 2 hilos diferentes (como en JBoss), la cuestión todavía existe, hasta que llamemos al em.refresh(parent)
Entonces, la pregunta es: ¿hay alguna manera de eliminar el problema sin problemas y garantizar que parent.getChildren()
siempre devuelva la lista actualizada de los niños?
Gracias por su extensa respuesta, Michael. He encontrado algo de buena información en él. Pero, me temo, no resuelve el problema que tengo porque dos instancias diferentes de EntityManager tienen dos cachés diferentes y cuando uno de ellos actualiza una instancia de entidad, el otro no ve la actualización y su entidad en caché se vuelve obsoleta – artemb
Suena como que necesita ver activadores de actualización que luego tomarán ese objeto y actualizarán el otro caché. O puede hacer que los dos miembros de caché pertenezcan al mismo clúster si almacena en clúster los soportes de solución de almacenamiento en memoria caché. –
Lamentablemente no tengo control sobre la memoria caché de la sesión de Hibernate. ¿O yo? – artemb