休眠陷阱

我已经使用Hibernate已有一段时间了,当我一段时间不使用Hibernate项目时,发现自己犯的错误与上次相同。

因此,这是我的监视清单,希望对其他人也有用。

实现hashCode和equals

一般而言,应该始终实现这些方法,但对于实体,应该多加注意。当我说等于时,您想到的第一件事可能是使用Id来区分实例。 好吧,那会给您带来很多麻烦。
您需要记住,您正在使用数据库实体而不是普通的POJO。

当Hibernate提取对象时,您将使用collections,因此使用equals和hashCode来知道您要查找的对象是否在会话中。 对于新对象,id将为null或0。
这意味着当试图保存两个相同类的对象时,第二个对象将覆盖第一个对象。
同样,当休眠保存新实例时,它将设置id,从而使它成为完全相同的不同对象。 您需要使用一些业务密钥。 唯一的代码很棒,但是如果您什么都想不起,只需使用一个有意义的字段和一些时间戳(例如创建日期)即可使其唯一。

如果您想进一步了解正在发生的事情, 是一个很好的参考。

小心一对一和多对一关系
这是您真正需要知道的。
在关系的“一对一”侧将关系映射为一对一或多对一时, 除非将字段指定为不可为空,否则您 不能延迟加载
这是为什么?
本质上,在关系的许多方面,hibernate可以使用集合代理,并在需要时延迟加载实例。 在“一个”一侧,没有集合接口,而是对您的一个模型类的引用。
Hibernate也可以代理该代理,但前提是必须确保引用永远不会为空!
因此,请记住,如果要进行延迟加载,请在一侧与延迟注释(或xml等效项)一起使用not null。
如果您的关系可以为空,但是您仍然真的想使其变得懒惰,那么您可以使用以下选择:
  • 创建一个值来表示该值。 例如,如果您具有诸如Person-& gtPartner之类的关系,则仅使用特定的Partner实例,即“无合作伙伴”。
  • 使用构建时间检测。 检查一下
  • 使用列表伪造一侧并使用get(0)获取字段

阅读更多有关休眠文档的信息

启用语句记录

这是验证Hibernate确实在按预期执行的唯一方法。 幸运的是,您可以使用不同的日志记录参数来找出HQL或SQL级别正在发生的事情。 您会惊讶于休眠状态运行查询的次数,而您没有看到它。 从一开始就尝试执行此操作,并帮助团队了解拥有最佳和最少查询的重要性,否则当您在某些实际数据上运行应用程序时,肯定会遇到性能问题。 要启用日志记录,只需在会话配置文件中设置此属性

hibernate.show_sql=true

如果要查看格式正确的添加

hibernate.format_sql=true
观察toString方法中的内容。

这又与Hibernate在没有真正意识到的情况下为您获取的内容有关。 很多时候,当您看到查询但无法弄清为什么要加载一些惰性列表时,请检查toString方法。
可能是罪魁祸首!

您的休眠陷阱是什么?

参考: Hibernate陷阱! 来自我们的JCG合作伙伴发展中博客上的 报道

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/08/hibernate-gotchas-to-watch-out.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值