Hibernate_持久化类

Hibernate持久化类

在Hibernate中持久化的英文名称时Persistent Object(简称PO),PO = POJO+hbm映射配置文件。

编写规则

  1. 必须提供一个无参数的public构造方法。
  2. 所有属性用private修饰,对外提供public的get/set方法。
  3. 在PO类必须提供一个标识属性,与数据库中的主键对应。我们管这属性叫OID。
  4. PO类中的属性尽量使用基本类型的包装类。
  5. 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
    22
    public 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)
    }
    }

http://ocx5m3vc3.bkt.clouddn.com/Hibernate%E5%AF%B9%E8%B1%A1%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81%E8%BD%AC%E6%8D%A2%E5%9B%BE.png