Hibernate持久化类
在Hibernate中持久化的英文名称时Persistent Object(简称PO),PO = POJO+hbm映射配置文件。
编写规则
- 必须提供一个无参数的public构造方法。
- 所有属性用private修饰,对外提供public的get/set方法。
- 在PO类必须提供一个标识属性,与数据库中的主键对应。我们管这属性叫OID。
- PO类中的属性尽量使用基本类型的包装类。
- PO类不能使用final修饰符。
为什么PO类必须提供一个标识属性OID,让它与数据库中的主键对应呢?
OID指的是数据库中表的主键对应的属性。Hibernate框架是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,那么Hibernate认为它们是一个对象。为什么PO类中的属性要尽量使用基本类型的包装类?
使用基本数据类型是没有办法去描述不存在的概念的。如果使用包装类型,它就是一个对象,对于对象它的默认值是null。如果它为null就代表这不存在。为什么PO类不能使用final修饰符?
因为Hibernate会使用代理模式在延迟关联的情况下提高性能。如果把实体类定义成final类之后,java不允许对final类进行扩展;所以Hibernate就无法再使用代理了。
持久化对象的三种状态
- 瞬时态:也叫做临时态或自由态,他一般指的我们new出来的对象,此时它不存在OID,与Hibernate Session无关联,在数据库中也无记录。
- 持久态:在Hibernate Session管理范围内,他具有持久化标识OID。它的特点是在事务未提交前一直是持久态,当它发生改变时,Hibernate会检测到。有OID且由Session管理,在数据库中可能有,也可能没有。
- 托管态:也叫游离态或离线态。它是指持久态对象失去了Session的关联。对于托管态对象,发生改变时Hibernate不会检测。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class HibernateTest {
// 测试持久化对象的三种状态
@Test
public void test2() {
// 1.得到session
Session session = HibernateUtils.openSession();
session.beginTransaction();
Customer c = new Customer(); // 瞬时态(无OID,与session无关联)
c.setName("张三");
c.setSex("男");
session.save(c); // 建立c与session的关联关系,它就是持久态的了(有OID)
// 2.事务提交,并关闭session
session.getTransaction().commit();
session.close();
System.out.println(c.getId()); // 断开了与session的关联,它就是脱管态的了(有OID)
}
}