posts - 1, comments - 0, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年6月25日

在NHibernate的一对多关系中,有两个配置属性是比较容易混淆的,就是inverse跟cascade,在查看了一资料后大要明白
他们的关系,特写在这里做个记号,日后忘记时可以看看
在Article这一边写上配置信息
    <bag name="CommentList" table="Comment" inverse="true" lazy="true" cascade="all">
      <key column="ArticleID"></key>
      <one-to-many class="Blog.Module.Comment,Blog.Module"></one-to-many>
    </bag>
在评论这边写上配置
      <many-to-one name="ArticleInfo" column="ArticleID" not-null="false" ></many-to-one>   
运行下面代码
        articleInfo = new Blog.Module.Article("测试""测试", DateTime.Now, 11);
        Blog.Module.Comment comment 
= new Blog.Module.Comment("测试评论""测试评论", DateTime.Now, 1);
        articleInfo.CommentList 
= new ArrayList();
        articleInfo.CommentList.Add(comment);
        comment.ArticleInfo 
= articleInfo;
        article.Add(articleInfo);
运行通过,文章和评论正常添加
接着将Article方的inverse设为false,再次运行,也通过了,但是通过事件查看器发现这一次的SQL脚本多运行了一个
Update Comment set ArticleID=@Article 的脚本,为什么会这种区别呢,因为inverse的作用就是这两个表的对应关
系由哪一方来维护,默认值为false,设为true表示不维护,所当Article的inverse的属性设为true时,Article表就不维护
两者之间的关系了,所以在添加Article时会遍历CommentList查找未被持久化的类(是否被持久化是通过将Comment.Id
与Comment.hbm.xml里面的unsaved-value进行比较,相等时证实还未被持久化),然后更新到数据库,如果inverse设为
false时则表示Article添加完成必须维护这一个一对多的关系,所以会对刚才添加的评论类的外键进行更新,确认两者之间的
对应关系,所以说一般情况下one的那一方都会设置inverse=true,可以减少一些不必要的操作

而cascade比较好理解一点,就是表示级联操作的程度,也就是如果cascade设置为none的话,不管Article的inverse怎么设置,上面的代码运行都不会添加评论的
cascade能设置的值有
all                        相当save-update加上delete
all-delete-orphan   相当all,并且会删除去父类失去关联的子类比如说Article.CommentList.RemoveAt(0),就会删除第一个子类
none                    父类的操作不会关联到子类
save-update         添加和更新进行级联操作
delete                  删除父类时,删除子类
delete-orphan       删除父类时,删除父类没有关系的子类



delete删除父类时删除所有父类关联的子类,但是不包括CommentList.RemoveAt出去的子类,因为这样的子类表示撤消关系,但是delete-orphan就会将整一个CommentList里面的子类删除,不管子类是否移除关系,因为移除关系的节点表示孤儿节点

posted @ 2008-06-25 09:52 马陈灵 阅读(45) | 评论 (0)编辑