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

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

实现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

Hibernate陷阱相关推荐

  1. 通过示例Hibernate–第2部分(DetachedCriteria)

    所以上次我们帮助正义联盟有效地管理了他们的超级英雄. 今天,我们集中讨论"复仇者联盟"将如何使用冬眠的"分离标准"找出每个超级英雄的敌人,以保护他们的超级英雄. ...

  2. hibernate示例_通过示例Hibernate–第1部分(删除孤儿)

    hibernate示例 所以我想做一系列的冬眠例子,展示冬眠的各种特征. 在第一部分中,我想展示有关删除孤儿功能及其在故事情节中的使用方式. 因此,让我们开始:) 先决条件 : 为了尝试以下示例,您将 ...

  3. jpa 查询集合_避免懒惰的JPA集合

    jpa 查询集合 Hibernate(实际上是JPA)具有集合映射:@ OneToMany,@ ManyToMany,@ ElementCollection. 默认情况下,所有这些都是惰性的. 这意味 ...

  4. orm框架选型问题_ORM问题

    orm框架选型问题 在过去的几年中,像Hibernate这样的对象关系映射工具已经帮助开发人员在处理关系数据库方面获得了巨大的生产力增长. ORM使开发人员可以专注于应用程序逻辑,并避免为诸如插入或查 ...

  5. Hibernate二级/查询缓存的陷阱

    这篇文章将介绍如何设置Hibernate二级和查询缓存,它们如何工作以及最常见的陷阱. 休眠二级缓存是用于存储实体数据的应用程序级缓存. 查询缓存是一个单独的缓存,仅存储查询结果. 这两个缓存实际上是 ...

  6. 贯穿应用开发始终的八大性能陷阱

    数据库访问低效.框架配置错误.内存使用过度.网页臃肿,以及不遵循常见Web性能最佳实践都是应用开发中常见的.影响应用性能的主要陷阱 .技术性能公司Computeware从实际案例总结了贯穿应用始终的八 ...

  7. 事务策略: 了解事务陷阱--转

    在 Java 平台中实现事务时要注意的常见错误 在应用程序中使用事务常常是为了维护高度的数据完整性和一致性.如果不关心数据的质量,就不必使用事务.毕竟,Java 平台中的事务支持会降低性能,引发锁定问 ...

  8. Hibernate 持久化状态、HQL语句大全(转)

    Hibernate 持久化状态 在Hibernate中,最核心的概念就是对PO的状态管理.一个PO有三种状态: 1.未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2.已被持久化的P ...

  9. jpa语法错误_JPA陷阱/错误

    jpa语法错误 根据我在帮助团队和进行培训方面的经验,这是我遇到的一些陷阱/错误,它们在使用JPA的基于Java的系统中引起了一些问题. 需要一个公共的无参数构造函数 始终使用双向关联/关系 将@On ...

最新文章

  1. 2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)
  2. PHP curl 实现RESTful PUT DELETE 实例
  3. python程序员月薪多少-据说做Python程序员,都月薪上万?
  4. Exchange 服务器查看版本号
  5. Java中伪造referer来获取数据
  6. 各种NLP操作难实现?谷歌开源序列建模框架Lingvo
  7. python画图视频_如何在视频文件的第一帧上画图,然后继续显示整个视频
  8. cocos2d-x初探学习笔记(12)--图形绘制
  9. 批量导入数据到mssql数据库的
  10. ruby和python_Ruby,Python和Java中的Web服务
  11. OpenCV (iOS)中的形态学变换(11)
  12. Hadoop HIVE 聚合查询
  13. Chrome 扩展工具及命令
  14. idea 2019最新版无法打开报错问题,Error occurred during initialization of VM Initial heap size set to a larger va
  15. python获取子窗口句柄
  16. linux在虚拟机添加一块10,redhat linux 虚拟机如何增加一块虚拟硬盘
  17. Tcp ip 网络编程入门(一)
  18. android v2签名机制,APK签名机制之——V2签名机制详解
  19. 计算机系统与配置要求,电脑系统以及Adobe Audition的版本配置要求-喜马拉雅
  20. 计算机网络的企业分析,计算机网络系统在企业中的应用分析

热门文章

  1. ssm使用全注解实现增删改查案例——Emp
  2. 2017蓝桥杯省赛---java---A---7(正则问题)
  3. SpringBoot+Vue博客系统---后端接口开发
  4. HBase出现java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration问题
  5. springboot创建项目
  6. linux中usb设备名,Linux 中识别 USB 设备名字的 4 种方法
  7. js解析json数组+java对象转json字符串
  8. spring(3)高级装配
  9. 最大子序列和问题的解(共4种,层层推进)
  10. Java SE 知识点