跳至主要內容

hibernate

HanTx大约 3 分钟SpringBoothibernateSpringBootJava数据库

Hibernate就是一个持久层的ORM(Object Relation Mapping)框架。

三种状态

hibernate中有三种状态

瞬时态Transient

new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的。
瞬时对象不会被持久化到数据库中,也不会被赋予持久化标识identifier
如果瞬时对象在程序中没有被引用,它会被垃圾回收器garbage collector销毁。
使用Hibernate Session可以将其变为持久状态(Hibernate会自动执行必要的SQL语句)。

瞬时状态的特点有:

  1. 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。
  2. Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
    举例:
User user=new User(); // user是一个瞬时对象,在数据库的表中是没有记录和该对象相对应的。和session没有关系。
user.setName(“ddd”);
user.setBirthday(new Date());
session.save(user); //持久化状态

持久态Persistent

持久是实例在数据库中有对应的记录,并拥有一个持久化标识identifier
持久的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。
Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元unit of work执行完毕时将对象数据state与数据库同步synchronize
开发者不需要手动执行Update
将对象从持久状态编程瞬时状态同样也不需要手动执行delete语句。

持久对象具有如下特点:

  1. session实例关联;
  2. 在数据库中有与之关联的记录。
  3. Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录。 举例:
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
session.save(stu); // persistent持久化状态
System.out.println(stu);
tx.commit();
session.close(); //执行close()方法之后,就会由持久对象转换成脱管对象
System.out.println(stu); // 脱管对象

脱管态Detached

与持久状态对象关联的Session被关闭后,对象就变为脱管的。
对脱管对象的引用依然有效,对象可继续被修改。
脱管对象如果重新关联到某个新的Session上,会再次转变为持久的(在脱管Detached其间的改动将被持久化到数据库)。
这个功能使得一种编程模型,即中间会给用户思考时间的长时间运行的操作单元。
脱管对象拥有数据库的识别值,可通过update()saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点:

  1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
  2. 比瞬时对象多了一个数据库记录标识值。
  3. 不在于Session相关联。
  4. 脱管对象一定是由持久态对象转化而来。