﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-mclkyo</title><link>http://www.cnblogs.com/mclkyo/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Oct 2008 06:39:52 GMT</lastBuildDate><pubDate>Thu, 16 Oct 2008 06:39:52 GMT</pubDate><ttl>60</ttl><item><title>inverse和cascade详解</title><link>http://www.cnblogs.com/mclkyo/archive/2008/06/25/1229112.html</link><dc:creator>马陈灵</dc:creator><author>马陈灵</author><pubDate>Wed, 25 Jun 2008 01:52:00 GMT</pubDate><guid>http://www.cnblogs.com/mclkyo/archive/2008/06/25/1229112.html</guid><wfw:comment>http://www.cnblogs.com/mclkyo/comments/1229112.html</wfw:comment><comments>http://www.cnblogs.com/mclkyo/archive/2008/06/25/1229112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mclkyo/comments/commentRss/1229112.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mclkyo/services/trackbacks/1229112.html</trackback:ping><description><![CDATA[在NHibernate的一对多关系中，有两个配置属性是比较容易混淆的，就是inverse跟<font face="Verdana">cascade，在查看了一资料后大要明白<br />
他们的关系，特写在这里做个记号，日后忘记时可以看看<br />
在Article这一边写上配置信息<br />
<font face="Verdana">&nbsp;&nbsp;&nbsp; &lt;bag name="CommentList" table="Comment" inverse="true" lazy="true" cascade="all"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="ArticleID"&gt;&lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="Blog.Module.Comment,Blog.Module"&gt;&lt;/one-to-many&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bag&gt;<br />
在评论这边写上配置<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">&nbsp;&lt;many-to-one name="ArticleInfo" column="ArticleID" not-null="false" &gt;&lt;/many-to-one&gt;</font>&nbsp;&nbsp;&nbsp;<br />
运行下面代码<br />
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Blog.Module.Article(</span><span style="color: #800000">"</span><span style="color: #800000">测试</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">测试</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;DateTime.Now,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blog.Module.Comment&nbsp;comment&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Blog.Module.Comment(</span><span style="color: #800000">"</span><span style="color: #800000">测试评论</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">测试评论</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;DateTime.Now,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleInfo.CommentList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleInfo.CommentList.Add(comment);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment.ArticleInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;articleInfo;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;article.Add(articleInfo);</span></div>
</font>运行通过，文章和评论正常添加<br />
接着将Article方的inverse设为false,再次运行，也通过了，但是通过事件查看器发现这一次的SQL脚本多运行了一个<br />
Update Comment set <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#65;&#114;&#116;&#105;&#99;&#108;&#101;&#73;&#68;&#61;&#64;&#65;&#114;&#116;&#105;&#99;&#108;&#101;">ArticleID=@Article</a> 的脚本，为什么会这种区别呢,因为inverse的作用就是这两个表的对应关<br />
系由哪一方来维护，默认值为false,设为true表示不维护,所当Article的inverse的属性设为true时，Article表就不维护<br />
两者之间的关系了，所以在添加Article时会遍历CommentList查找未被持久化的类(是否被持久化是通过将Comment.Id<br />
与Comment.hbm.xml里面的<font face="Verdana">unsaved-value</font>进行比较,相等时证实还未被持久化),然后更新到数据库,如果inverse设为<br />
false时则表示Article添加完成必须维护这一个一对多的关系,所以会对刚才添加的评论类的外键进行更新,确认两者之间的<br />
对应关系,所以说一般情况下one的那一方都会设置inverse=true,可以减少一些不必要的操作<br />
<br />
而cascade比较好理解一点,就是表示级联操作的程度,也就是如果cascade设置为none的话,不管Article的inverse怎么设置,上面的代码运行都不会添加评论的<br />
cascade能设置的值有<br />
<font face="Verdana">all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相当save-update加上delete<br />
all-delete-orphan&nbsp;&nbsp; 相当all,并且会删除去父类失去关联的子类比如说Article.CommentList.RemoveAt(0),就会删除第一个子类<br />
none&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;父类的操作不会关联到子类<br />
save-update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加和更新进行级联操作<br />
delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除父类时,删除子类<br />
delete-orphan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除父类时,删除父类没有关系的子类</font><br />
<br />
<br />
delete删除父类时删除所有父类关联的子类,但是不包括CommentList.RemoveAt出去的子类,因为这样的子类表示撤消关系,但是delete-orphan就会将整一个CommentList里面的子类删除,不管子类是否移除关系,因为移除关系的节点表示孤儿节点<br />
 <img src ="http://www.cnblogs.com/mclkyo/aggbug/1229112.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43022/" target="_blank">[新闻]2008年10月16日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>