hibernate
大约 3 分钟
Hibernate就是一个持久层的ORM(Object Relation Mapping)框架。
三种状态
hibernate中有三种状态
瞬时态Transient
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的。
 瞬时对象不会被持久化到数据库中,也不会被赋予持久化标识identifier。
 如果瞬时对象在程序中没有被引用,它会被垃圾回收器garbage collector销毁。
 使用Hibernate Session可以将其变为持久状态(Hibernate会自动执行必要的SQL语句)。
瞬时状态的特点有:
- 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。
 - 与
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语句。
持久对象具有如下特点:
- 和
session实例关联; - 在数据库中有与之关联的记录。
 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()等方法,转变成持久对象。
脱管对象具有如下特点:
- 本质上与瞬时对象相同,在没有任何变量引用它时,
JVM会在适当的时候将它回收; - 比瞬时对象多了一个数据库记录标识值。
 - 不在于
Session相关联。 - 脱管对象一定是由持久态对象转化而来。