Hibernate深入浅出(三)实体对象周期中的3种状态

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。

你可能感兴趣的:(Hibernate,状态,实体对象周期)