2010-01-13 9 views
25

¿Existen recursos de Internet que tengan una guía definitiva de todos los ajustes de cascada de NHibernate que incluirán ejemplos de la estructura de clases, HBM y las implicaciones de las acciones con cada una de las configuraciones de cascada para todos las relaciones con NH.NHibernate Definitive Cascade application guide

También sería útil si hubiera ejemplos de asociaciones comunes que se hicieran de la manera más correcta, como configurar una tabla de estados que nunca terminará en cascada eliminando un estado, o eliminar un objeto que tiene una La propiedad CreateBy User nunca terminará borrando al usuario en cascada, etc.

Respuesta

57

Lo siguiente está adaptado de la referencia de Java Hibernate http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive para NHiberate 3.0 (es decir, el tronco svn actual).

Para cada operación básica de la sesión de NHibernate - incluyendo Persist(), Merge(), SaveOrUpdate(), Delete(), Lock(), Refresh(), Evict(), Replicate() - hay un correspondiente estilo de cascada. Respectivamente, los estilos de cascada se denominan persistir, fusionar, guardar-actualizar, eliminar, bloquear, actualizar, desalojar, replicar. El estilo de cascada para Save() y Update() es save-update; para SaveAndUpdateCopy() es fusión; y para PersistOnFlush() persiste. Y eliminar es un alias para eliminar.

Si desea que una operación se realice en cascada a lo largo de una asociación, debe indicarlo en el documento de asignación. Por ejemplo:

<one-to-one name="person" cascade="persist"/> 

estilos en cascada Mi combinar:

<one-to-one name="person" cascade="persist,delete,lock"/> 

Se puede utilizar en cascada = "all" para especificar que todas las operaciones deben ser conectados en cascada a lo largo de la asociación. La cascada predeterminada = "ninguno" especifica que ninguna operación se va a conectar en cascada.

Un estilo de cascada especial, eliminar huérfano, se aplica solo a asociaciones de uno a muchos, e indica que la operación Eliminar() se debe aplicar a cualquier objeto secundario que se elimine de la asociación. Y all-delete-huérfano es lo mismo que all, delete-huérfano.

recomendaciones:

  • Por lo general no tiene sentido para permitir la cascada en una < muchos-a-uno o > < muchos-a-muchos > asociación. Cascade suele ser útil para < one-to-one > y < one-to-many > asociaciones.
  • Si la vida útil del objeto secundario está limitada por la duración del objeto principal, conviértalo en un objeto de ciclo de vida especificando cascade = "all-delete-huérfano".
  • De lo contrario, es posible que no necesite cascada en absoluto. Pero si crees que a menudo trabajarás con tus padres e hijos juntos en la misma transacción, y quieres ahorrarte algo de tipeo, considera usar cascade = "persist, merge, save-update".

La asignación de una asociación (una asociación de un solo valor o una colección) con cascade = "all" marca la asociación como una relación de estilo primario/secundario donde guardar/actualizar/eliminar el elemento primario guarda/actualiza/eliminar del niño o los niños. Un hijo que se vuelve sin referencia por su padre no se elimina automáticamente, excepto en el caso de una < asociación uno a muchos > mapeada con cascada = "eliminar-huérfano". La semántica precisa de las operaciones en cascada para una relación padre/hijo son los siguientes:

  • Si un padre se pasa a persistir(), se pasan todos los niños para que persistan()
  • Si un padre se pasa a Merge(), se pasan todos los niños a Merge()
  • Si un padre se pasa a Save(), Update() o saveOrUpdate(), todos los niños se pasan a saveOrUpdate()
  • Si un niño transitoria o separada se convierte referenciado por un padre persistente, se pasa a SaveOrUpdate()
  • Si se elimina un padre, todos los chi ldren se pasa a Delete()
  • Si un padre persistente desreferencia a un hijo, no ocurre nada especial; la aplicación debe eliminar explícitamente el elemento secundario si es necesario, a menos que cascade = "delete-huérfano", en cuyo caso el "huérfano" niño es eliminado
+1

+1 y generosidad, una respuesta muy útil. –

+2

¡Hola! ¡Tu enlace está roto! –

3

Esto podría ser un consejo obvio, pero le sugiero que explore la publicación anterior hecha por Ayende. Una rápida search para NHibernate y cascada en su sitio reveló algunas publicaciones interesantes. Sin embargo, podrían ser demasiado escasos para sus necesidades.

Aunque no es un recurso de Internet per se, también recomendaría NHibernate in Action. Aborda las cascadas con cierta profundidad en los capítulos 3, 4 y 6. El libro está dirigido a NHibernate 1.2. Creo, sin embargo, que habrá una nueva edición del libro que apunta al lanzamiento 3.0 de NHibernate; podría valer la pena vigilarlo.

Por mucho que me hubiera gustado ver una guía definitiva de cascadas, no he visto ninguna. Tal vez puedas resumir algunas de las publicaciones de blog que están discutiendo cascadas con tu propia publicación en tu propio blog.

+0

Desafortunadamente estaba empezando a creer que este era el caso, sin embargo, es bueno saberlo en NHibernate in Action. Tengo tanto blogging para hacer y tan poco tiempo. –

+0

Definitivamente tampoco he encontrado una documentación oficial para Nhibernate 3 con mapeo por código, etc. Creo que esa es una de las desventajas de NHibernate: es demasiado complejo para no tener un doc actualizado –

3

no sé ninguna guía "definitiva", pero el mejor recurso que sé es una entrada de blog de Ayende, que es uno de los gurús definitivas en NHibernate:

NHibernate Cascades: the different between all, all-delete-orphans and save-update

Para mí, De hecho, solo uso cascade="none" y cascade="all". all-delete-orphan a veces es una opción. Todo lo demás es sospechoso Por ejemplo, ¿por qué debería crear implícitamente una instancia porque se hace referencia a ella, cuando vive más tiempo que el objeto que la contiene? Para mí, solo hay dos situaciones: o el objeto es dependiente o independiente.

Cuestiones relacionadas