祝威廉 2009-10-14 17:55
浏览 316
已采纳

hibernate 关联保存 的困惑

两个POJO,Riji(日记) 和Rijipinglun (日记评论)
[code="java"]
Riji riji=findRiji(id);
Rijipinglun rijipinglun=new Rijipinglun();
[color=red]riji.getRijipingluns().add(rijipinglun);
rijipinglun.setRiji(riji);[/color]
save(rijipinglun);
[/code]
问题就在两句红的那,如果我只写第二句,那么hibernate会发出两个语句,一个查询日记,一个保存评论,
可是加了红色 第一句,那么hibernate会多发出一个查找相关评论的语句
hibernate视乎推荐第二个,为什么,这样好像效率更低

[b]问题补充:[/b]
[code="java"]Riji riji=findRiji(id);

Rijipinglun rijipinglun=new Rijipinglun();

riji.getRijipingluns().add(rijipinglun);

rijipinglun.setRiji(riji);

save(rijipinglun); [/code]
可能问题还没问清楚。
我觉得下面这句可有可无,因为通常多端是控制端,并且一般都是,而且设置了级联
保存更新,而下面的句子平白的多了一次查询,及查询日记的所有评论记录。
[color=red]riji.getRijipingluns().add(rijipinglun);[/color]
[b]问题补充:[/b]
蔡华江 lovewhzlq 都讲到了关联双向。我现在考虑了一下:
事实上
riji.getRijipingluns().add(rijipinglun);
不会对持久化有影响。
当然有时候估计操作方便,可能还会用到,比如同时要持久化多个
riJiPinglun,那么没有前面那句话,就得一个一个去save.
对于hibernate 一级缓存而言(个人认为一级缓存作用不大),持久化了riJiPinglun之后紧接着就会关闭session,而在另一个session中取得日记所属日记评论。

另外大部分时候调用riji.getRijipingluns()都会导致加载所有的数据,通常我们会使用过滤或者hql限制取得条件。

  • 写回答

3条回答 默认 最新

  • CaiHuajiang 2009-10-14 19:46
    关注

    如果使用单向关联,或者不使用Hibernate二级缓存、且同一个一级缓存中进行增加后不再进行查询操作,就没必要了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • wanghaolovezlq 2009-10-14 18:49
    关注

    hibernate内部机制实现就是这样,级联保存的问题

    你保存多的一端

    评论
  • wanghaolovezlq 2009-10-14 19:40
    关注

    这句是有用的,这是保持双向关联的好的方式,当然如果你映射文件是单向关联的话,那就没必要这一句了

    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 初学者c语言题目解答
  • ¥15 div editable中的光标问题
  • ¥15 mysql报错1415Not allowed to return a result set from a trigger 不知如何修改
  • ¥60 Python输出Excel数据整理,算法较为复杂
  • ¥15 回答几个问题 关于数据库
  • ¥15 51单片机串口通信问题,未完成且要修改
  • ¥15 百鸡问题 c++编程问题(相关搜索:输出数据)
  • ¥30 如何在CMD中设置代理
  • ¥15 我有一块薛定谔的硬盘
  • ¥15 微信小游戏开发2D碰撞检测问题