3种状态:
1.Transient(自由状态)
与数据库中的记录无关。
e.g.
TUser user = new TUser();这里的user对象与数据库中的记录没有任何关联。
2.Persistent(持久状态)
处于由Hibernate框架所管理的状态。
对应了数据库中的一条记录。
与某个session实例发生了关联,并处于对应session的有效期内。
e.g.
a)
TUser user = (TUser)session.load(TUser.class, new Integer(1));由Hibernate加载
b)
TUser user = new TUser();
user.setName("Lily");//Transient状态
session.save(user);//由Transient状态转化为Persistent状态
c)
TUser user = (TUser)session.load(TUser.class, new Integer(1));
session.close();
user.setName("Lily_1");//Detached状态
session2.update(user);//由Detached状态转化为Persistent状态
3.Detached(游离状态)
对应数据库中的一条记录。对应的session实例关闭。
e.g.
a)
TUser user = (TUser)session.load(TUser.class, new Integer(1));
session.close();
user.setName("Lily_1");//Persistent状态转化为Detached状态
b)
TUser user = new TUser();
user.setName("Lily");
user.setId(15);//假设id=15存在,手动得到Detached状态的对象
session可看作Persistent对象的宿主
状态转化:
1.Transient->Persistent
session.save执行后,Hibernate对user对象进行了持久化,并为其赋予了主键值,可以唯一确定库表中的一条记录,那么user对象自然可以与库表中具备同样id值的记录相关联。
2.Persistent->Transient
session.delete
3.Detached->Persistent
与session关联。session.update
4.Persistent->Detached
关闭对象对应的session。
判断:
1.判断一个对象是否处于Transient状态
a)首先,对象的id属性(如果存在此属性)是否为null;
b)如果指定了id属性的unsaved-value,那么id属性是否等于unsaved-value;
c)如果配备了version属性(乐观锁),version属性是否为null;
d)如果配备了version属性,且为version指定了unsaved-value,version属性值是否等于unsaved-value;
e)如果存在Interceptor(Hibernate拦截),那么Interceptor.isUnsaved方法是否放回true。