ORM框架之对象识别
一、对象识别
对数据库而言,其识别一条记录唯一性的方式是根据主键值,如果手上有两条记录,它们拥有同样的主键值,则它们在数据库中代表同一个字段的记录。
二、两种方式
对Java而言,要识别两个对象是否为同一个对象有两种方式
- 内存地址识别(“= =”号识别)
- 根据equals()、hasCode()中 的定义
1.内存地址识别
先探讨第一种Java的识别方式在Hibernate中该注意的地方,在Hibernate中,如果是在同一个session中根据相同查询所得到的相同记录,则它们会拥有相同的Java识别
Session session = sessions.openSession();
Person p1 = (Person)session.get(Person.class,1);
Person p2 =(Person)session.get(Person.class,1);
session.close();
System.out.println(p1= = p2);
程序片段将会显示true的结果, 表示p1与p2是参考至同一对象
如果是以下的情况则会显示false:
Session session1 = sessions.openSession();
Person.p1 = (Person)session.get(Person.class,1);
session1.close();
Session session2 = sessions.openSession(;
Person p2 = (Person)session.get(Person.class,1);
session2. close(;
System.out.println(p1 == p2);
使用==来比较两个对象的记录是否代表数据库中的同一条记录是不可行的。如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写equals()与hashCode()。
2.equals()、hasCode()
重写方法之一,equals()与hashCode( )的方法是根据数据库的identity,就是透过getid()方 法取得对象的id值并加以比较
1.hashCode( )方法
User.java
public int hashCode() {
int result;
result = getName ().hashCode();
result= 18* result + getBirthday().hashCode();
result= 18* result + getAge();
return result;
}
2.equals())方法
User.java
public boolean equals(Object obj) {
//如果相同,返回true;如果obj为空,则false
if(this == obj) return true;
if(obj == null) return false;
if(!(obj instanceof User)) {return false;}
}
//强转
User other = (User)obj;
if(id!=other.id) {
return false;
}
if(age!=other.age) {
return false;
}
//注意name是字符串,前提是name不为空,以下方法都重写了
if(!name.equals(other.name)){
return false;
}
if(!gender.equals(other.gender)){
return false;
}
if(!birthday.equals(other.birthday)){
return false;
}
三、测试
建立testObjectIndentify
输出结果为true true false true
false原因:c,d的地址不同,所以c,d引用值不同,因此不相等。
第四个true:equals是默认引用,但此处equals重写,虽然引用不同,但内容是相同的。
try{
sf =HibernateUtil.getSessionFactory();//sessionFactory单态模式
session = sf.getCurrentSession();//保证每个读写线程有唯一的session的实例
ts = session.beginTransaction();
String a = "abc";
String b ="abc";
System.out.println(a == b);
System.out.println(a.equals(b));
String c = "pq";
String d ="pq";
System.out.println(c == d);
System.out.println(c.equals(d));
ts.commit();
总结
本文主要讲述了识别两个对象是否为同一个对象的两种方式,此处详细的解释并展示了equals()、hasCode()的相关代码。