随笔 - 63  文章 - 0  trackbacks - 0
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

Hibernate实体对象的生命周期

关键字: hibernate学习笔记
在用Hibernate的时候,时不时会因为没有处理好实体对象的状态而犯一些莫名其妙的异常,在这里对实体对象的各种状态整理一下,希望能有所帮助。

Hibernate实体对象,即指Hibernate O/R影射关系中的域对象 即O/R中的"O"。在Hibrenate实体对象的生命周期中存在着三中状态,即:
1:自由状态(Transient)。
2:持久状态(Persistent)。
3:游离状态(Detached)。

1:自由状态(Transient)
自由状态(Transient),是指实体对象在内存中自由存在,他与数据库的记录无关。如:
Java代码
  1. TUser user = new TUser();   
  2. user.setName("MyName");  

这里的user对象只是一个非常普通的java对象,与数据库中的记录没有任何关系。

2:持久状态(Persistent)
持久状态(Persistent),即实体对象处于Hibernate框架的管理状态,实体对象被纳入Hibernate的实体容器中管理。处于持久状态的对象,其更变将由Hibernate固化到数据库中。如:
Java代码
  1. //创建两个处于自由状态的实体对象。   
  2. TUser user_1 = new TUser();   
  3. TUser user_2 = new TUser();   
  4.   
  5. user_1.setName("Name_1");   
  6. user_2.setName("Name_2");   
  7.   
  8. Transaction tx = session.begintransaction();   
  9. session.save(user_1);   
  10. //通过session的save方法,user_1对象已经被纳入Hibernate的实体管理容器,处于持久化状   
  11. //态(Persistent),这时候对user_1对象的任何修改都将被同步到数据库中。   
  12.   
  13. tx.commit();   
  14.   
  15. //而user_2仍然才处于自由状态(Transient),不受Hibernate框架的管理。  

从上面看到,处于自由状态的实体对象,可以通过Hibernate的Session.sava方法转化为持久状态
除了用Session.save方法外,还可以通过其他方法来获取一个持久状态的对象,那就是直接通过Hibernate加载的对象,通过Session.load方法,可以直接加载一个处于持久状态的实体对象。如下:
Java代码
  1. TUser user = Session.load(TUser.class,new Integer(1));   
  2. //在load方法没返回之前,就已经先把对象纳入Hibernate的管理范围,所以这里的user   
  3. //已经处于持久状态。  

从上面的代码可以看出,处于持久状态的实体对象一定要和Session关联,并处于该Session的有效期内。

3:游离状态(Detached)
处于持久状态的实体对象,在其关联的Session关闭以后,此实体对象就处于游离状态
Java代码
  1. TUser user = new TUser();   
  2. user.setName("name_1");   
  3. Transaction tx = session.begintransaction();   
  4. session.save(user);//把自由状态的实体对象user转为持久状态,   
  5. tx.commit();   
  6. session.close();   
  7. //session关闭以后,处于持久状态的实体对象user将转为游离状态。   
  8. //因为此时user已经和session脱离关系。  


由上面可以看到实体对象的游离状态是在对象和它所寄宿的Session脱离关系后形成的,但处于自由状态的实体对象也没有和任何session有关联,那么他们两者有什么区别呢?关键的就在我们对自由状态的实体对象执行了Session.save方法,
当我们执行
Java代码
  1. TUser user = new TUser();  

时,我们只是创建了一个普通的对象,他并没有和数据库里的任何一条记录对应,当我们执行
Session.save以后,Hibernate就为user设置了一个主键,就是user.Id属性,通过这个属性,Hibernate就把user对象和数据库里的记录关联起来,所以自由状态游离状态的基本区别就是 处于游离状态的实体对象,在数据库里有对应的记录,因此它可以通过和session关联再次转为持久状态

三种状态的转化
自由状态-->持久状态:可以通过Session.sava方法来转换。
持久状态-->游离状态:可以通过Session.close方法来关闭session,获取游离状态的对象
持久状态-->自由状态:可以通过Session.delete方法来删除实体对象对应的数据库记录,使实体对象处于自由状态。

补充一下,有时可能会想,可以通过认为的个处于自由状态的实体对象设置一个Id值
Java代码
  1. user.Id=1  
,来人为的创建一个游离状态的对象。
这里注意一点,我们可以人为地给实体对象设置Id值,我我们无法知道这个ID值在数据库里有没有对应的记录,如果没有,就算我们人为地设置了Id,也不能说一个有ID的实体对象就是一个游离状态的对象。
posted on 2009-04-08 12:02 lanxin1020 阅读(244) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: