hibernate session 的特点

Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)

Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。

实例可能以下面三种状态存在:
自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联

游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE。

其具体实现并不一定是线程安全的。每个线程/事务应该从一个SessionFactory获取自己的session实例。

如果其持久化对象类是可序列化的,则Session实例也是可序列化的。

一个典型的事务应该使用下面的形式:

Java代码   收藏代码
  1. Session sess = factory.openSession();  
  2. Transaction tx;  
  3. try {  
  4. tx = sess.beginTransaction();  
  5. //do some work  
  6. ...  
  7. tx.commit();  
  8. }  
  9. catch (Exception e) {  
  10. if (tx!=null) tx.rollback();  
  11. throw e;  
  12. }  
  13. finally {  
  14. sess.close();  
  15. }  


如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步。
taopian (高级程序员) 2009-01-10
当然要关闭,一般session关闭才代表着事务提交。session的打开到关闭的这段时间,根据自己的实际需求掌握。为了代码的简洁和方便一般使用一个template加回调方法的模式管理。但是如果使用hibernate lazyload,如果在service层关闭session,到view层才实际加载某些对象,会提示session已经关闭。在spring框架里面提供了open session in view模式,把session的打开关闭的区间控制在一次http request上,这是一种比较好的实践。可以参考Spring的HibernateTemplate和事务控制机制还有openSessionInView模式。
xjtuwgc (初级程序员) 2009-01-10
session不使用的时候就可以关闭咯!

当然spring还提供了openSessionInView机制,简单来说就是使用延迟加载时候可以使用到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值