祝威廉 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二级缓存、且同一个一级缓存中进行增加后不再进行查询操作,就没必要了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程