操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

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

2007-9-27 网友评论 0 条 点击进入论坛

  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所作的操作还可以回滚吗?

  答案是仍然可以回滚的.

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46732 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail