Hibernate官方文档
manaul
中提到,hibernate实体有三种状态:Transient、Persistent、Detached。本文参考了官网手册和
http://blog.csdn.net/hgd250/article/details/2775943这篇博客。
1、Transient状态
An object is transient if it has just been instantiated using the new operator, and it is not associated with a Hibernate Session. It has no persistent representation in the database and no identifier value has been assigned. Transient instances will be destroyed by the garbage collector if the application does not hold a reference anymore. Use the Hibernate Session to make an object persistent (and let Hibernate take care of the SQL statements that need to be executed for this transition).
//创建一个Transient对象
User user=new User();
user.setName("root");
user.setPassword("root");
//此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.
特点:
- 通过new创建和实例化,没有为id自动赋值
- 数据库中没有与实体对象对应的记录
- 与Hibernate的Session有任何的关联,也就是说没有调用Session中的方法
2、
Persistent状态
A persistent instance has a representation in the database and an identifier value. It might just have been saved or loaded, however, it is by definition in the scope of a Session. Hibernate will detect any changes made to an object in persistent state and synchronize the state with the database when the unit of work completes. Developers do not execute manual UPDATE statements, or DELETE statements when an object should be made transient.
User user=new User();
user.setName("username");
user.setPassword("password");
//此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.
Session session = sessionFactory.openSession();
Transaction tx=session.beginTransaction();
//此时的user仍为一个Transient对象
session.save( user );
//此时的user为Persistent
tx.commit();
//提交后向数据库中加入一条记录.
Transaction tx2=session.beginTransaction();
user.setPassword("abc");
tx2.commit();
//虽然在这个事务中没有调用Session的save()方法来保存user对象
//但由于user对象处于persistent状态,所以对user所做的任何修改都将被持久
//化到数据库,所以这时数据库中的密码已经变为abc;
session.close();
特点:
- 每个persistent状态的实体对象都与一个session对象的实例相关联
- 处于Persistent状态的实体对象是与数据库中的记录相关联的.
- Hibernate会依据persistent状态的实体对象的属性变化而改变数据库中相对应的记录
3、Detached状态
A detached instance is an object that has been persistent, but its Session has been closed. The reference to the object is still valid, of course, and the detached instance might even be modified in this state.
//创建一个Transient对象
User user=new User();
user.setName("username");
user.setPassword("password");
//此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.
Session session = sessionFactory.openSession();
Transaction tx=session.beginTransaction();
//此时的user仍为一个Transient对象
session.save( user );
//此时的user为Persistent
tx.commit();
//提交后向数据库中加入一条记录.
session.close();
//此时user为Detached 状态,此时对user所进行的任何修改,将不会对数据库有任何影响.
特点
- 游离态是由持久态实体对象转变而来的。当session.close()的时候,持久态就变成了游离态。
- 游离态实体不再与session对象相关联.
- 游离态实体对象与数据库中的记录没有直接联系,对其所做的任何修改将不会影响到到数据库中的数据.
- 游离态实体对象,仍然有唯一的标识符,数据库中仍然有与之对应的记录
实体的状态以及转换都是比较简单的,但是我不明白为什么Hibernate要区分这3种状态。首先瞬时态与Hibernate没有任何关联,自然是没有存在的必要;持久态虽然session能够自动将修改同步到数据库,但是这种特性意义也不大,因为我们实际开发中DAO层是不会写业务逻辑的,session在dao层方法调用结束后就会关闭;游离态,感觉只是概念上的东东,实际上也没有什么意义,我们一般从DAO返回查询结果后,不会在意这些对象的状态。
也就是说我们使用Hibernate进行开发的时候,不会在意这些状态的。小弟实在是不明白这3种状态,真正的价值何在,求大神们指点迷津啊!