对数据库而言,其识别一条记录唯一性的方式是根据主键值,如果手上有两条记录,它们拥有同样的主键值,则它们在数据库中代表同一个字段的记录。
对Java而言,要识别两个对象是否为同一个对象有两种方式
内存地址识别(“= =”号识别)
根据equals()、hasCode()中的定义
(默认Object类中定义的equals(Object o)方法也是按内存地址来比较的),源码如下:
public boolean equals(Object obj){
return (this==obj);
}
先探讨第一种Java的识别方式在Hibernate中该注意的地方,在Hibernate中,如果是在同一个session中根据相同查询所得到的相同记录,则它们会拥有相同的Java识别
1.参考同一对象
package com.entity;
import org.hibernate.Session;
import org.junit.Test;
import com.utils.HibernateUtils;
public class TestDemo3 {
@Test
public void test1(){
Session session=HibernateUtils.getSession();
Customer p1 = (Customer)session.get(Customer.class,1);
Customer p2 =(Customer)session.get(Customer.class,1);
session.close();
System.out.println(p1 == p2);
}
}
测试截图:
2.比较两个对象的记录
@Test
public void test2(){
Configuration cig = new Configuration().configure();
SessionFactory sessionFactory = cig.buildSessionFactory();
Session session1 = sessionFactory.openSession();
Customer c1 =(Customer)session1.get(Customer.class,1) ;
session1.close();
Session session2 = sessionFactory.openSession();
Customer c2 =(Customer)session2.get(Customer.class,1) ;
session2.close();
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
}
使用==来比较两个对象的记录是否代表数据库中的同一条记录是不可行的。如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Customer))
return false;
final Customer customer = (Customer)obj;
if(this.id==customer.id&&
this.username.equals(customer.username)&&
this.age==customer.age&&
this.sex.equals(customer.sex)&&
this.city.equals(customer.city)
){
return false;
}
public int hashCode() {
int result=0;
result = this.username.hashCode()+this.sex.hashCode()+this.city.hashCode();
result = 29 * age + result;
return result;
}
3.对象地址不同
@Test
public void test3(){
String a=new String("AbC");
String b=new String("AbC");
System.out.println(a==b);
System.out.println(a.equals(b));
}