网页教学网
 当前位置: 网页教学网 >> 网络编程 >> JSP编程技术 >> EJB中使用Hibernate的方法以及常见问题
[ HTML ] [ FW ] [ DW ] [ FP ] [ JS ] [ XML ] [ CSS ] [ 图象 ] [ FLASH ] [ .NET ] [ ASP ] [ JSP ] [ PHP ] [ 数据 ] [ 系统 ] [ 安全 ] [ 素材 ] [ 建站 ] [ 主机 ] [ 入门 ] [ 技巧 ]

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

http://www.webjx.com  更新日期:2007-09-07 07:32  出处:网页教学网  作者:

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

答案是仍然可以回滚的.

关键词:EJB,Hibernate
推荐给好友】【关闭】【收藏本文
最新五条评论
查看全部评论
评论总数 0
您的评论
用户名: 新注册) 密 码: 匿名:
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为