En griales, que puede poner en práctica una N: 1 relación de la siguiente manera:¿Cuándo se debe usar Many para las relaciones N: 1 en las clases de dominio Grails?
class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }
ahora (si AddTo y removeFrom es siempre utiliza correctamente) que puede hacer que los niños de los padres a través de parent.children.
Pero también puede hacerlo sin hasMany:
class Parent { }
class Child { belongsTo = [parent:Parent] }
entonces tengo que usar Child.findAllByParent (padre) para llegar a todos los niños.
Mi pregunta: ¿Hay alguna razón importante por la que debería usar hasMany si también puede consultar los hijos de un padre de la segunda manera?
Supongo que a veces es más fácil (y quizás más rápido si se busca junto con el padre?) Simplemente referirse a parent.children, pero por otro lado esta lista puede ser bastante larga cuando hay varios hijos. Y lo que no me gusta de Many tampoco es que siempre tenga que preocuparse por addTo o removeFrom o para borrar la sesión después de agregar un nuevo Child con un Parent para que grails lo haga automáticamente ...
Is la respuesta es que simplemente debes usar hasMany si hay pocos niños y no usarlo si hay muchos (por razones de rendimiento), o hay más detrás de esto?
Gracias, así que todo se trata del comportamiento en cascada. ¿Diría que el rendimiento no es un problema cuando la lista para administrar para los niños se vuelve muy grande? En cuanto a su actualización, desafortunadamente se guarda con flush: true no es suficiente para addTo/removeFrom automático. Como aprendí en mi ejemplar sometido a Grails https://cvs.codehaus.org/browse/GRAILS-6356, debes borrar la sesión con sessionFactory.currentSession.clear() si quieres lograr esto DENTRO de una prueba o un controlador . En una producción con scaffolded, funciona porque la sesión se borra después de la acción de guardar/actualizar del elemento secundario. –
Acabo de probarlo y parece que la eliminación en cascada es lo opuesto a lo que dice al principio: en mi PRIMER ejemplo (con hasMany), al eliminar un elemento primario, también se eliminan todos los elementos secundarios. En el SEGUNDO ejemplo (sin hasMany), los niños deben borrarse manualmente antes de eliminar un elemento principal. –
En realidad, mis pruebas también revelaron que en su ejemplo con hasMany y no belongsTo, la eliminación de parent no provoca que los hijos tengan un padre nulo pero arroja una DataIntegrityViolationException ... Tengo que establecer los padres de los hijos en null antes de la eliminación . –