打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Hibernate入门之实作equals和hashCode
实作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()的例子,当然留下的问题就是您如何在实作时利用相关的商务键值,这就要根据您实际的商务需求来决定了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Hibernate实体的equals和hashcode
Hibernate 4 持久化类
使用TreeSet集合比较Comparable接口和Comparator接口的区别 - 低级写手 android QQ群 13585749 - JavaEye技术网站
详解equals()方法和hashCode()方法
Java源码解析
hibernate 关联主键映射 composite-id - hacker0825的日志...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服