因此,这是我的监视清单,希望对其他人也有用。
实现hashCode和equals
通常,应该始终实现这些方法,但是对于实体,应该多加注意。当我说等于时,您想到的第一件事可能是使用Id来区分实例。 好吧,那会给您带来很多麻烦。
您需要记住,您正在使用数据库实体而不是普通的POJO。
当Hibernate提取对象时,您将使用collections,因此使用equals和hashCode来知道您要查找的对象是否在会话中。 对于新对象,id将为null或0。
这意味着当试图保存两个相同类的对象时,第二个对象将覆盖第一个对象。
同样,当Hibernate保存新实例时,它将设置id,从而使它成为完全相同的不同对象。 您需要使用一些业务密钥。 唯一的代码很棒,但是如果您什么都想不起,只需使用一个有意义的字段和一些时间戳(例如创建日期)即可使其唯一。
如果您想进一步了解正在发生的事情, 这是一个很好的参考。
小心一对一和多对一关系
这是您真正需要知道的。
在关系的“一对一”侧将关系映射为一对一或多对一时, 除非将字段指定为不可为空,否则您 不能延迟加载 。
这是为什么?
基本上,在关系的许多方面,Hibernate都可以使用集合代理,并在需要时延迟加载实例。 在“一个”一侧,没有集合接口,而是对您的一个模型类的引用。
Hibernate也可以代理该主机,但前提是必须确保引用永远不会为空!
因此,请记住,如果要进行延迟加载,请在一侧与延迟注释(或xml等效项)一起使用not null。
如果您的关系可以为空,但是您仍然真的想使其变得懒惰,那么您可以选择以下方法:
- 创建一个值来表示该值。 例如,如果您具有诸如Person-& gt; Partner之类的关系,则仅使用一个特定的Partner实例,即“无合作伙伴”。
- 使用构建时间检测。 检查一下
- 使用列表伪造一侧并使用get(0)获取字段
有关Hibernate文档的信息 。
启用语句记录
这是验证Hibernate确实在执行您期望他执行的操作的唯一方法。 幸运的是,您可以使用不同的日志记录参数来找出HQL或SQL级别正在发生的事情。 您会惊讶Hibernate状态运行查询的次数,而您没有发现它。 从一开始就尝试执行此操作,并帮助团队了解拥有最佳和最少查询的重要性,否则当您在某些实际数据上运行应用程序时,肯定会遇到性能问题。 要启用日志记录,只需在会话配置文件中设置此属性
hibernate.show_sql=true
如果要查看格式正确的添加
hibernate.format_sql=true
观察toString方法中的内容。
这又与Hibernate在没有真正意识到的情况下为您获取的内容有关。 很多时候,当您看到查询但无法弄清为什么要加载一些惰性列表后,再检查toString方法。
可能是罪魁祸首!
您的Hibernate陷阱是什么?
参考: Hibernate陷阱! 来自我们的JCG合作伙伴 在进行中的开发博客中 。
- Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
- DataNucleus 3.0与Hibernate 3.5
- Hibernate映射集合性能问题
- Spring MVC3 Hibernate CRUD示例应用程序
翻译自: https://www.javacodegeeks.com/2011/08/hibernate-gotchas-to-watch-out.html