En un proyecto basado en Spring/Hibernate, tenemos una relación de uno a varios entre dos entidades. Las operaciones requeridas son:¿Deberían evitarse las asociaciones bidireccionales de Hibernate?
- encontrar el padre del niño;
- encontrar a los hijos del padre;
- cuando se eliminan los padres, también tenemos que eliminarlos;
- mass-create the children.
Se nos ocurrió dos formas de implementar esto.
Bidirectional association: entidad secundaria tiene
@ManyToOne
columna vinculándola a los padres, y los padres tienen@OneToMany
colección perezoso cargado de los niños. Todas las operaciones anteriores pueden realizarse en el modelo:child.getParent(); parent.getChildren(); //lazy loading session.delete(parent); //cascade removal of the children does the trick here session.save(parent); //cascade persist created the children
unidireccional asociación: Entidad niño tiene
@ManyToOne
columna vinculándola a los padres, pero el padre no tiene ningún vínculo con los niños. La mayoría de las operaciones se deben realizar en los métodos de servicio:child.getParent(); //still in the model Collection<Child> findChildren(Parent parent); //service method in ChildService void deleteChildren(Parent parent); //service method in ChildService void createChild(Parent parent, ... childAttributes); //service method in ChildService invoked for each new child.
El primer enfoque parece ser más fácil de implementar (se puede volver a utilizar Hibernate funcionalidad en cascada) pero algunos de vernos las asociaciones bidireccionales como una causa potencial de problemas .
¿Cuál debería ser una mejor opción de diseño? ¿Existen problemas, desempeño o diseño conocidos, creados por el enfoque bidireccional?
¿Conoces una fuente que explique cómo hacer que funcione lazyloading? Tuve problemas con esto en un proyecto JSF. –
"algunos de nosotros consideramos que las asociaciones bidireccionales son una posible causa de problemas". ¿Puede nombrar estos posibles problemas? –