Hibernate入门17 - 实作equals和hashCode
来源:互联网 发布:阿里御膳房数据体系 编辑:程序博客网 时间:2024/06/07 10:59
入门 17 - 实作equals和hashCode
Hibernate并不保证不同时间所取得的数据对象,其是否参考至内存的同一位置,使用==来比较两个对象的数据是否代表数据库中的同一笔数据是不可行的,而Object预设的equals()本身即比较对象的内存参考,如果您要有必要比较透过查询后两个对象的数据是否相同(例如当对象被储存至 Set时)您必须实作equals()与hashCode()。
一个实作equals()与hashCode()的方法是根据数据库的identity,一个方法是透过getId()方法取得对象的id值并加以比较,例如若id的型态是String,一个实作的例子如下:
User.java
public class User {
....
public boolean equals(Object o) {
if(this == o) return true;
if(id == null || !(o instanceof User)) return false;
final User user == (User) o;
return this.id.equals(user.getId());
}
public int hasCode() {
return id == null ? System.identityHashCode(this) : id.hashcode();
}
}
这个例子取自于Hibernate in Action第123页的范例,然而这是个不被鼓励的例子,因为当一个对象被new出来而还没有save()时,它并不会被赋予id值,这时候就不适用这个方法。
一个比较被采用的方法是根据对象中真正包括的的属性值来作比较,在参考手册中给了一个例子:
Cat.java
public class Cat {
...
public boolean equals(Object other) {
if (this == other) return true;
if (!(other instanceof Cat)) return false;
final Cat cat = (Cat) other;
if (!getName().equals(cat.getName())) return false;
if (!getBirthday().equals(cat.getBirthday())) return false;
return true;
}
public int hashCode() {
int result;
result = getName().hashCode();
result = 29 * result + getBirthday().hashCode();
return result;
}
}
我们不再简单的比较id属性,这是一个根据商务键值(business key)实作equals()与hasCode()的例子,当然留下的问题就是您如何在实作时利用相关的商务键值,这就要根据您实际的商务需求来决定了。
- Hibernate入门17 - 实作equals和hashCode
- 入門 17 - 實作equals和hashCode
- Hibernate实体hashcode和equals方法
- Hibernate为什么要重写equals和hashCode方法
- hibernate之什么时候必须实现equals()和hashCode()方法?
- Hibernate为什么要重写equals和hashCode方法
- Hibernate联合主键重写equals和hashCode方法
- hibernate中联合主键重写equals和hashCode
- 【JAVA】hibernate实体中equals、hashCode和==
- hibernate中提倡持久类实现equals()和hashCode()分析
- Equals and HashCode in Hibernate
- equals() 和 hashCode()
- hashcode()和equals()方法
- hashcode() 和 equals()方法
- 关于equals和hashCode
- 重写equals()和hashCode()
- 关于hashcode()和equals()
- hashcode和equals
- Hibernate入门14 - Set与Map的排序
- 你能撑到什么时候(不断更新中)
- Hibernate入门15 - Component的集合映像
- Hibernate入门16 - 对象状态与识别
- 管理学:魅力动力,用管理魅力去影响你的员工
- Hibernate入门17 - 实作equals和hashCode
- B2AFM_SF for becky! Windows 9x/ME/NT/2K/XP
- Hibernate入门18 - 多对一实体映像
- google 的21道面试问题
- Hibernate入门19 - 一对多实体映像
- Hibernate入门20 - cascade持久化
- 我奋斗了18年才和你坐在一起喝咖啡
- Hibernate入门21 - 双向关联与inverse设定
- 浅谈HOOK技术在VC编程中的应用