对Java而言要识别两个对象是否为同一对象有两种方式
1.内存地址识别(“==”号识别)。
2.根据equals()、hashCode()中的定义识别。
在hibernate中,如果在同一session中根据相同查询所得到的相同记录,则它们会有相同的内存地址。但是如果是不同的session中查询的相同记录,它们的内存地址就会不同。因此,使用“==”来比较两条记录是否代表数据库中的同一记录是不可行的。如果有必要比较通过查询后的内容是否相同,必须重写equals()与hashCode()方法。
@Entity
public class Student {
private int ID;
private String name;
private String gender;
private int age;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [ID=" + ID + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = gender.hashCode() + name.hashCode();
result = prime * age + result;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (ID == other.ID && age == other.age && gender.equals(other.gender) && name.equals(other.name))
return true;
return false;
}
}