一、对象识别
对数据库而言,其实别一条记录唯一性的方式是根据主键的值,如果手上有两条记录,他们拥有相同的主键值,则它们在数据库中代表同一个对象的记录
对于Java而言,要识别两个对象是否为同一个对象有两种方法
- 内存地址识别(“==”)识别
- 根据equals()、hasCode()中的定义
? (默认Object类中的equals(Object o)方法也是按内存地址来比较的),源码如下:
public boolean equales(Object obj){ ???return (this == obj);}
在Hibernate中,如果是在同一个Session中根据相同查询所得到的记录,则它们会拥有相同的Java识别。例:
@Test ???public void test1(){ ???????Configuration configuration = new Configuration().configure(); ???????SessionFactory sessionFactory = ?configuration.buildSessionFactory(); ???????Session session = sessionFactory.getCurrentSession(); ???????Transaction t = session.beginTransaction(); ???????Customer c1 = session.get(Customer.class,1); ???????Customer c2 = session.get(Customer.class,1); ???????System.out.println(c1 == ?c2); ???}
这个程序片段会显示true,标识c1和c2是同一个对象。
@Test ???public void test2(){ ???????Configuration configuration = new Configuration().configure(); ???????SessionFactory sessionFactory = ?configuration.buildSessionFactory(); ???????Session session1 = sessionFactory.openSession(); ???????Transaction t = session1.beginTransaction(); ???????Customer c1 = session1.get(Customer.class,1); ???????session1.close(); ???????Session session2 = sessionFactory.openSession(); ???????Transaction t2 = session2.beginTransaction(); ???????Customer c2 = session2.get(Customer.class,1); ???????session2.close(); ???????System.out.println(c1 == ?c2); ???}
以上程序片段会显示false,说明了使用==来比较两个对象的记录是否代表数据库中的同一条记录是不可行的。如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。
重写的equals()和hashCode()代码如下:
package com.test.bean;public class Customer { ???@Override ???public boolean equals(Object o) { ???????if (this == o) return true; ???????if (o == null || getClass() != o.getClass()) return false; ???????Customer customer = (Customer) o; ???????if (!id.equals(customer.id)) return false; ???????if (!name.equals(customer.name)) return false; ???????if (!gender.equals(customer.gender)) return false; ???????if (!age.equals(customer.age)) return false; ???????return city.equals(customer.city); ???} ???@Override ???public int hashCode() { ???????int result = id.hashCode(); ???????result = 31 * result + name.hashCode(); ???????result = 31 * result + gender.hashCode(); ???????result = 31 * result + age.hashCode(); ???????result = 31 * result + city.hashCode(); ???????return result; ???}}
这个代码可以通过IDE自动生成,我们再来进行如下的测试:
@Test ???public void test3(){ ???????Configuration configuration = new Configuration().configure(); ???????SessionFactory sessionFactory = ?configuration.buildSessionFactory(); ???????Session session1 = sessionFactory.openSession(); ???????Transaction t = session1.beginTransaction(); ???????Customer c1 = session1.get(Customer.class,1); ???????session1.close(); ???????Session session2 = sessionFactory.openSession(); ???????Transaction t2 = session2.beginTransaction(); ???????Customer c2 = session2.get(Customer.class,1); ???????session2.close(); ???????System.out.println(c1.equals(c2)); ???}
这是返回的就是true了。
Hibernate学习(三)
原文地址:https://www.cnblogs.com/RicardoWX/p/9062486.html