![](/img/trans.png)
[英]Is there a definitive guide to programmatically creating Exchange Mailboxes remotely?
[英]NHibernate Definitive Cascade application guide
是否有任何互联网资源对NHibernate的所有级联设置有明确的指导,其中包括类结构,HBM的示例以及与NH的所有关系的每个级联设置的动作的含义。
如果有以最正确的方式进行公共关联的示例,例如设置状态表,您将永远不会最终级联删除状态,或者删除具有CreatedBy用户属性的对象,那么它将会很有用。永远不会在级联等中删除用户
以下内容改编自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"/>
级联风格我的组合:
<one-to-one name="person" cascade="persist,delete,lock"/>
您可以使用cascade =“all”指定所有操作都应该沿关联级联。 默认级联=“none”指定不进行级联操作。
特殊的级联样式delete-orphan仅适用于一对多关联,并指示Delete()操作应应用于从关联中删除的任何子对象。 all-delete-orphan与all,delete-orphan相同。
建议:
使用cascade =“all”映射关联(单值关联或集合)将关联标记为父/子样式关系,其中父项的保存/更新/删除导致保存/更新/删除子项或儿童。 除非在使用cascade =“delete-orphan”映射的<one-to-many>关联的情况下,否则不会自动删除未被其父级引用的子级。 父/子关系的级联操作的精确语义如下:
这可能是明显的建议,但我建议浏览Ayende制作的旧帖子。 在他的网站上快速搜索 NHibernate和级联显示了一些有趣的帖子。 但是,它们可能对您的需求有点过于稀缺。
即使它本身不是互联网资源,我也会推荐NHibernate in Action 。 它在第3,4和6章深入讨论了级联。本书针对NHibernate 1.2。 不过,我相信会有一本针对NHibernate 3.0版本的新版本。 可能值得关注。
尽管我希望看到一个关于级联的权威指南,但我还没有看到过。 也许你可以总结一些博客文章,在你自己的博客上用你自己的帖子讨论级联。
我不知道任何“权威”指南,但我知道的最好的资源是来自Ayende的博客文章,他是NHibernate的权威大师之一:
NHibernate Cascades:所有,all-delete-orphans和save-update之间的区别
对我来说,我实际上只使用cascade="none"
和cascade="all"
。 all-delete-orphan
有时是一个选项。 其他一切都是可疑的。 例如,为什么我应该隐式创建一个实例,因为它被引用,当它比包含对象长寿命时? 对我来说,只有两种情况:对象是依赖对象还是独立对象。
接受的答案详细解释了HBM文件。 这个答案涵盖了按代码映射的相同内容。 它们几乎相同; 刚刚映射到他们的HBM字符串。
文章形式Ayende解释得很好:
- none - 不做任何级联,让用户自己处理它们。
- save-update - 保存/更新对象时,检查关联并保存/更新任何需要它的对象(包括在多对多方案中保存/更新关联)。
- delete - 删除对象时,删除关联中的所有对象。
- delete-orphan - 删除对象时,删除关联中的所有对象。 除此之外,当从关联中删除对象而不与另一个对象(孤立对象)关联时,也删除它。
- all - 当对象保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。
- all-delete-orphan - 当一个对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。 除此之外,当从关联中删除对象而不与另一个对象(孤立对象)关联时,也删除它。
此外, 这个问题解释了Cascade
一些内部实现。
[Flags] public enum Cascade { None = 0, Persist = 2, Refresh = 4, Merge = 8, Remove = 16, Detach = 32, ReAttach = 64, DeleteOrphans = 128, All = 256, } private static IEnumerable<string> CascadeDefinitions(this Cascade source) { if (source.Has(Cascade.All)) { yield return "all"; } if (source.Has(Cascade.Persist)) { yield return "save-update, persist"; } if (source.Has(Cascade.Refresh)) { yield return "refresh"; } if (source.Has(Cascade.Merge)) { yield return "merge"; } if (source.Has(Cascade.Remove)) { yield return "delete"; } if (source.Has(Cascade.Detach)) { yield return "evict"; } if (source.Has(Cascade.ReAttach)) { yield return "lock"; } if (source.Has(Cascade.DeleteOrphans)) { yield return "delete-orphan"; } }
请注意, Cascade.All
不包括Cascade.DeleteOrphans
。 在这种情况下,您可能需要使用Cascade.All | Cascade.DeleteOrphans
来包含它 Cascade.All | Cascade.DeleteOrphans
。
或者,您可以使用Include
扩展方法Cascade.All.Include(Cascade.DeleteOrphans)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.