Hibernate学习
Posted ricardowx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate学习相关的知识,希望对你有一定的参考价值。
一、对象识别
对数据库而言,其实别一条记录唯一性的方式是根据主键的值,如果手上有两条记录,他们拥有相同的主键值,则它们在数据库中代表同一个对象的记录
对于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学习的主要内容,如果未能解决你的问题,请参考以下文章