Hibernate 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()的例子,当然留下的问题就是您如何在实作时利用相关的商务键值,这就要根据您实际的商务需求来决定了。

转载于:https://my.oschina.net/alexgaoyh/blog/207591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值