Java 在EJB Hibernate环境中使用JDBC

Java 在EJB Hibernate环境中使用JDBC,java,hibernate,jdbc,transactions,ejb,Java,Hibernate,Jdbc,Transactions,Ejb,我对JDBC连接、事务及其在EJB、JTA和Hibernate环境中的集成有点困惑。我的疑问是: 当我们使用@Resource DataSource ds。。。getConnection(),我们是否在托管bean使用的同一事务中工作?我们应该关闭连接、语句、结果集吗 那么session.doWork呢?我们是同一笔交易吗?结束语句和结果集呢 Hibernate中的主动释放模式意味着在每个语句之后都会关闭连接。这是否意味着事务也已提交?(我不认为这是真的,但我不明白Hibernate在这里是如何

我对JDBC连接、事务及其在EJB、JTA和Hibernate环境中的集成有点困惑。我的疑问是:

  • 当我们使用@Resource DataSource ds。。。getConnection(),我们是否在托管bean使用的同一事务中工作?我们应该关闭连接、语句、结果集吗

  • 那么session.doWork呢?我们是同一笔交易吗?结束语句和结果集呢

  • Hibernate中的主动释放模式意味着在每个语句之后都会关闭连接。这是否意味着事务也已提交?(我不认为这是真的,但我不明白Hibernate在这里是如何工作的)


  • 有几件事你需要弄清楚。首先你需要确定你的工作单位是什么。 每个请求的会话模式是最常用的模式之一,除非您有特定的需求,否则请坚持使用该模式。 如果您使用的是Hibernate,则不会直接使用语句和结果集。Hibernate会帮你的。您需要关闭的是hibernate会话

    您使用的是SessionFactory和会话对象。该课程几乎代表了您的工作单元。在hibernate会话中,您可以获取对象,更改它们并将它们保存回来。 每请求会话模式在接收到请求时打开会话,在发送回响应时关闭会话

    在容器管理的EJB会话bean中,事务可用,并且您(或hibernate)在此类容器中使用的数据源由JTA TransactionManager自动处理

    现在,由于Hibernate很智能,它可以自动将“当前”会话绑定到当前JTA事务。 这使得在SessionFactory上使用getCurrentSession()方法可以轻松实现每请求会话策略:

    try {
        UserTransaction tx = (UserTransaction)new InitialContext()
                                .lookup("java:comp/UserTransaction");
    
        tx.begin();
    
        // Do some work
        factory.getCurrentSession().load(...);
        factory.getCurrentSession().persist(...);
    
        tx.commit();
    }
    catch (RuntimeException e) {
        tx.rollback();
        throw e; // or display error message
    }
    
    因此,要回答您的问题:

    如果在容器中使用Hibernate和JTA,最好使用JPA EntityManager或spring Hibernate模板

    以下是一些参考资料:
    http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html

    我通过JPA和EntityManager使用Hibernate,使用CMT(容器管理事务)。因此,我不会手动开始并提交事务,而是将作业留给容器。所以您回答了第一个问题:我从ds.getConnection获得的连接由容器管理,并且与我的entitymanager处于同一事务中。但是其他两个问题呢?在doWork中,连接由hibernate会话管理。所以,是的,你仍然在同一个会话中,只要你没有显式地打开一个新会话,你仍然会。我认为在使用JTA时,AFTER_语句或攻击模式是默认的发布模式。在这种情况下,hibernate不会提交您的事务,而是您的JTA TransactionManager