本文主要是介绍hibernate实体类中为何要重写equals与hashcode方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.如果想把持久类的实例放入set中(多值关联时,1对多),建议实现equals和hashcode2.想重用托管实例时,也要实现equals和hashcode
3.多个字段组合作为联合主键,必须实现equals和hashcode方法
这两个方法都来自于Object对象,根据API文档查看下原意。(1)public boolean equals(Objectobj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。(2)public int hashCode() 返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,Java.util.Hashtable
提供的哈希表。
import java.util.*;
class BeanA {
private int i;
public BeanA(int i) {
}
public String toString() {
}
public boolean equals(Object o) {
}
public int hashCode() {
}
}
public class HashCodeTest {
public static void main(String[] args) {
}
}
我们在类BeanA中重写了equals和hashcode方法,这样在存储到HashSet数据集中,将保证不会出现重复的数据;如果把这两个方法去掉后,那些重复的数据仍会存入HashSet中,这就与HashSet强调的元素唯一性相违背,大家可以把这两个方法注释掉再运行一下。
因此,我们就可以理解在一些java类中什么情况下需要重写equals和hashcode。比如:在hibernate的实体类中,往往通过一个主键(或唯一标识符)来判断数据库的某一行,这就需要重写这两个方法。因为,Hibernate保证,仅在特定会话范围内,持久化标识(数据库的行)和Java标识是等价的。因此,一旦 我们混合了从不同会话中获取的实例,如果希望Set有明确的语义,就必 须实现equals() 和hashCode()。
这篇关于hibernate实体类中为何要重写equals与hashcode方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!