简述Hibernate两种方法的实现
创始人
2024-06-08 03:20:28
0

Hibernate有很多方法,每一种方法都有自己实现的过程,这里详述Hibernate两种方法的实现Hibernate equals()和Hibernate hashCode()。

实现Hibernate equals()和hashCode()如果你有如下需求,你必须重载 equals() 和 hashCode()方法:

想把持久类的实例放入Set中(当表示多值关联时,推荐这么做)

想重用脱管实例

Hibernate保证,仅在特定会话范围内,持久化标识(数据库的行)和Java标识是等价的。因此,一旦 我们混合了从不同会话中获取的实例,如果希望Set有明确的语义,就必 须实现equals() 和hashCode()。

实现Hibernate equals()/HibernatehashCode()最显而易见的方法是比较两个对象标识符的值。如果值相同,则两个对象对应于数据库的同一行,因此它们是相等的(如果都被添加到 Set,则在Set中只有一个元素)。

不幸的是,对生成的标识不能 使用这种方法。Hibernate仅对那些持久化对象赋标识值,一个新创建的实例将不会有任何标识值。此外, 如果一个实例没有被保存(unsaved),并且它当前正在一个Set中,保存它将会给这个对象 赋一个标识值。

如果Hibernate equals() 和Hibernate hashCode()是基于标识值 实现的,则其哈希码将会改变,这违反了Set的契约。建议去Hibernate的站点阅读关于这个 问题的全部讨论。

注意:这不是Hibernate的问题,而是一般的Java对象标识和Java对象等价的语义问题。

我们建议使用业务键值相等(Business key equality)来实现equals() 和 hashCode()。业务键值相等的意思是,equals()方法 仅仅比较形成业务键的属性,它能在现实世界里标识我们的实例(是一个自然的候选码)。

  1. public class Cat {  
  2.  
  3.     ...  
  4.     public boolean equals(Object other) {  
  5.         if (this == other) return true;  
  6.         if ( !(other instanceof Cat) ) return false;  
  7.  
  8.         final Cat cat = (Cat) other;  
  9.  
  10.         if ( !cat.getLitterId().equals( getLitterId() ) ) return false;  
  11.         if ( !cat.getMother().equals( getMother() ) ) return false;  
  12.  
  13.         return true;  
  14.     }  
  15.  
  16.     public int hashCode() {  
  17.         int result;  
  18.         result = getMother().hashCode();  
  19.         result = 29 * result + getLitterId();  
  20.         return result;  
  21.     }  
  22.  

注意:

业务键不必像数据库的主键那样固定不变。对业务键而言,不可变或唯一的属性是不错的选择。

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. 解读Hibernate高级集合映射
  5. Hinerbate单端关联代理颇析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...