NHibernate Definitive Cascade应用指南

Chr*_*sic 25 c# nhibernate cascade

是否有任何互联网资源对NHibernate的所有级联设置有明确的指导,其中包括类结构,HBM的示例以及与NH的所有关系的每个级联设置的动作的含义.

如果有以最正确的方式进行公共关联的示例,例如设置状态表,您将永远不会最终级联删除状态,或者删除具有CreatedBy用户属性的对象,那么它将会很有用.永远不会在级联等中删除用户

Lac*_*che 57

以下内容改编自NHiberate 3.0 的Java Hibernate参考http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive(即当前的svn trunk) .

对于NHibernate会话的每个基本操作 - 包括Persist(),Merge(),SaveOrUpdate(),Delete(),Lock(),Refresh(),Evict(),Replicate() - 都有相应的级联样式.级联样式分别命名为persist,merge,save-update,delete,lock,refresh,evict,replicate.Save()和Update()的级联样式是save-update; 对于SaveAndUpdateCopy(),它是合并; 对于PersistOnFlush(),它是持久的.删除是删除的别名.

如果希望沿关联级联操作,则必须在映射文档中指明该操作.例如:

<one-to-one name="person" cascade="persist"/>
Run Code Online (Sandbox Code Playgroud)

级联风格我的组合:

<one-to-one name="person" cascade="persist,delete,lock"/>
Run Code Online (Sandbox Code Playgroud)

您可以使用cascade ="all"指定所有操作都应该沿关联级联.默认级联="none"指定不进行级联操作.

特殊的级联样式delete-orphan仅适用于一对多关联,并指示Delete()操作应应用于从关联中删除的任何子对象.all-delete-orphan与all,delete-orphan相同.

建议:

  • 在<many-to-one>或<many-to-many>关联上启用级联通常没有意义.Cascade通常用于<one-to-one>和<one-to-many>关联.
  • 如果子对象的生命周期受父对象的生命周期限制,则通过指定cascade ="all-delete-orphan"将其设置为生命周期对象.
  • 否则,您可能根本不需要级联.但是如果你认为你经常在同一个交易中与父母和孩子一起工作,并且你想节省一些打字,可以考虑使用cascade ="persist,merge,save-update".

使用cascade ="all"映射关联(单值关联或集合)将关联标记为父/子样式关系,其中父项的保存/更新/删除导致保存/更新/删除子项或儿童.除非在使用cascade ="delete-orphan"映射的<one-to-many>关联的情况下,否则不会自动删除未被其父级引用的子级.父/子关系的级联操作的精确语义如下:

  • 如果将父级传递给Persist(),则所有子级都将传递给Persist()
  • 如果将父项传递给Merge(),则所有子项都将传递给Merge()
  • 如果将父级传递给Save(),Update()或SaveOrUpdate(),则所有子级都将传递给SaveOrUpdate()
  • 如果一个临时或已分离的子进程被持久父进程引用,则将其传递给SaveOrUpdate()
  • 如果删除父项,则将所有子项传递给Delete()
  • 如果孩子被持久父母取消引用,则不会发生任何特殊情况 - 应用程序应在必要时明确删除子项 - 除非cascade ="delete-orphan",在这种情况下,"孤立"子项将被删除.