快速业务通道

EJB中使用Hibernate的方法以及常见问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18

EJB中使用Hibernate的方法以及常见问题

时间:2011-02-21

EJB中使用Hibernate的方法应该大家都会,不过许多人可能没注意下面几个问题,首先我们来看下面这段代码。

public class HibernateTestBean implements SessionBean ...{   SessionContext sessionContext;   SessionFactory sf;   public void setSessionContext(SessionContext sessionContext) ...{     this.sessionContext = sessionContext;     try ...{       InitialContext ctx = new InitialContext();       sf=(SessionFactory) ctx.lookup("java:/hibernate/SessionFactory");     } catch (NamingException ex) ...{       ex.printStackTrace();     }   }   public void tran()...{     tran1();     tran2();   }   public void tran1() ...{     Session session=sf.getCurrentSession();     Message msg=new Message();     msg.setCreateTime(new Date());     msg.setDetail("trans1");     session.save(msg);     System.out.println("Session:"+session.hashCode());     session.flush();     session.close();   }   public void tran2() ...{    Session session=sf.getCurrentSession();    Message msg=new Message();    msg.setCreateTime(new Date());    msg.setDetail("trans2");    session.save(msg);     System.out.println("Session:"+session.hashCode()); // throw new RuntimeException("wrong");  } …… }

注:EJB采用CMT,各方法的事务属性是required

客户端调用tran以上代码可以正确运行吗?

如果把tran1中的sf.getCurrentSession();改为sf.openSession()可以正确运行吗?

辨析:

1 上述代码是不能正确运行的,运行tran2时会抛出异常,告诉你session is closed.

其实这是应为getCurrentSession()会使用环境已有的Session,同时注意getCurrentSession()要在事务的环境中使用。

这是也许你一定会问,那么什么时候关闭Session呢?答案是事务完成的时候(提交或是回滚)。

2 如果上述代码tran1中的sf.getCurrentSession();改为sf.openSession()代码将可以正确运行。这是因为openSession()每次都会返回一个新的Session。而在tran2种的sf.getCurrentSession()并不会使用tran1中的session,而是会使用当前事务环境中的默认的session.

也许你会问如果tran2种的调用抛出RuntimeException,tran1所作的操作还可以回滚吗?

答案是仍然可以回滚的.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号