祝威廉 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 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?