wjzliu0064
2009-01-09 17:51 阅读 320
已采纳

hibernate 一对多级联保存问题

hibernate 一对多级联保存时,保存完一方和多方的对象后,怎又去更新多方的对象,为何?不明白,请教下
[b]问题补充:[/b]
是级联保存的,hibernate会先保存一方对象,再保存多方对象,再又去更新多方的所有对象,我想知道Hibernate这样做的用意何在?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    weixin_42299499 weixin_42299499 2009-01-15 12:32

    原因很简单,你问为什么会发出很多的update的SQL语句(如果你将SET标签添加上inverse="true"就不会有这样的情况,反转交给多的一方来维护),因为你现在是在让一的一方来维护关系:举个例子class和 student测试存储的方法中,
    (1)你要先NEW出几个student对象
    (2)创建一个SET集合,并添加student实体对象
    (3)创建一个class对象,给这个实体的保留student SET集合的属性students赋值
    (4)session.save(class);
    你如果你要直接运行这个方法的话,会抛出transiont objecte excption 异常,因为在(1)中你的student对象为transient状态,要转化为persistent状态,要session.save(student1);....都要save;
    ----此时你会在输出端会看到hibernate发出了SQL insert语句,但是外键现在没有值
    此时你的数据库student表中,外键字段class_id那列为里面都是NULL值,
    接着执行,当session.save(class);
    -----此时你才会看到hibernate发出了SQL update语句:
    只要就是为了update student set class_id=".."where id="..",故存在几个student实体对象,就会发出几个update 。

    通过上面可以看出它的缺点也就是:
    第一:如果你将student表里的class_id字段设置为空,你就会无法保存数据;
    第二:在class一方的一端会发出多余的update语句,你可以想象如果我要存1000个学生,那么你在一的一方维护关系,它就会发出1000条update。。。。。。

    一般不重要做,都是添上inverse=“true”反转给多的一方维护即可!

    你可以在Eclipe 写测试方法设置断点来调试看下! :wink:

    点赞 评论 复制链接分享
  • etank2011 etank2011 2009-01-09 17:58

    你在一方的配置文件中是不是指定了cascade属性,如果有指定(all或者save或者update),则在保存一方时自动会保存多方的数据的

    点赞 评论 复制链接分享
  • weixin_42513366 Candyut 2009-01-10 01:14

    最后更新的是关联字段的值。。

    JE中的如你所述的讨论:
    http://www.iteye.com/topic/91245

    点赞 评论 复制链接分享
  • weixin_42299499 weixin_42299499 2009-01-15 12:37

    ————只要就是为了update student set class_id=".."where id="..",故存在几个student实体对象,就会发出几个update————————

    写错了个字,主要是为了.... ,说白了就是有一的一方来负责给多的一方的表中的外键
    class_id赋值,这样才能维护两者的关系!

    点赞 评论 复制链接分享

相关推荐