以下内容改编自Java Hibernate参考http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive对于NHiberate 3.0(即当前的svn trunk)。
对于 NHibernate Session 的每个基本操作 - 包括 Persist()、Merge()、SaveOrUpdate()、Delete()、Lock()、Refresh()、Evict()、Replicate() - 都有相应的级联样式。级联样式分别命名为 persist、merge、save-update、delete、lock、refresh、evict、replicate。 Save()和Update()的级联风格是save-update;对于 SaveAndUpdateCopy() 来说,它是合并;对于 PersistOnFlush() 来说,它是持久的。而remove是delete的别名。
如果您希望操作沿着关联级联,则必须在映射文档中指出。例如:
<one-to-one name="person" cascade="persist"/>
级联样式可以组合:
<one-to-one name="person" cascade="persist,delete,lock"/>
您可以使用cascade="all" 指定所有操作都应沿着关联级联。默认的cascade=“none”指定不级联任何操作。
一种特殊的级联样式,delete-orphan,仅适用于一对多关联,并指示应将Delete() 操作应用于从关联中删除的任何子对象。 all-delete-orphan 与 all,delete-orphan 相同。
建议:
- 在 或 关联上启用级联通常没有意义。级联对于和关联通常很有用。
- 如果子对象的生命周期受父对象生命周期的限制,则通过指定cascade="all-delete-orphan"使其成为生命周期对象。
- 否则,您可能根本不需要级联。但是,如果您认为您经常在同一个事务中与父级和子级一起工作,并且您想节省一些打字时间,请考虑使用cascade="persist,merge,save-update"。
使用cascade="all"映射关联(单值关联或集合)将关联标记为父/子样式关系,其中父项的保存/更新/删除会导致子项的保存/更新/删除,或者孩子们。父级未引用的子级不会自动删除,除非是使用cascade="delete-orphan"映射的关联。父子关系的级联操作的精确语义如下:
- 如果将父级传递给 Persist(),则所有子级都会传递给 Persist()
- 如果将父级传递给 Merge(),则所有子级都会传递给 Merge()
- 如果将父级传递给 Save()、Update() 或 SaveOrUpdate(),则所有子级都会传递给 SaveOrUpdate()
- 如果持久父级引用瞬态或分离的子级,则会将其传递给 SaveOrUpdate()
- 如果父级被删除,所有子级都会传递给Delete()
- 如果持久父级取消引用子级,则不会发生任何特殊情况 - 应用程序应在必要时显式删除子级 - 除非cascade =“delete-orphan”,在这种情况下,“孤立”子级将被删除。