【问题标题】:Working with JDBC in EJB-Hibernate env在 EJB-Hibernate 环境中使用 JDBC
【发布时间】:2011-07-09 10:56:45
【问题描述】:

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

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

  2. session.doWork 呢?我们在同一个交易中吗?结束语句和结果集呢?

  3. Hibernate 中的积极释放模式意味着连接在每个语句之后关闭。这是否意味着事务也已提交? (我不认为这是真的,但我无法理解 Hibernate 在这里是如何工作的)

【问题讨论】:

    标签: java hibernate jdbc transactions ejb


    【解决方案1】:

    您需要弄清楚一些事情。首先,您需要确定您的工作单元是什么。 session-per-request 模式是最常用的模式之一,除非您有特定需求,否则请坚持使用。 如果您使用的是 Hibernate,则不要直接使用语句和结果集。 Hibernate 会为你做到这一点。你需要关闭的是休眠会话

    你使用的是一个 SessionFactory 和一个 Session 对象。会话几乎代表了您的工作单元。在休眠会话中,您获取对象,更改它们并将它们保存回来。 每个请求的会话模式在收到请求时打开一个会话,并在发回响应时关闭它。

    在容器管理的 EJB 会话 bean 中,事务可用,并且您(或休眠)在此类容器中使用的数据源由 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
    }
    

    所以回答你的问题:

    如果您在容器中使用带有 JTA 的 Hibernate,则最好使用 JPA EntityManager 或 spring hibernate 模板。

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

    【讨论】:

    • 我通过 JPA 和 EntityManager 使用 Hibernate,使用 CMT(容器管理事务)。所以我不会手动开始和提交事务,而是将工作留给容器。所以你要回答第一个问题:我从 ds.getConnection 获得的连接是由容器管理的,并且在我的 entitymanager 的同一个事务中。但是其他 2 个问题呢?
    • 在 doWork 中,连接由休眠会话管理。所以是的,你仍然在同一个会话中,只要你不明确打开一个新会话,你仍然会是。
    • 我认为 AFTER_STATEMENT 或积极模式是使用 JTA 时的默认发布模式。在这种情况下,hibernate 不会提交您的事务,而是您的 JTA TransactionManager
    猜你喜欢
    • 2012-02-25
    • 2019-03-05
    • 2011-08-05
    • 2019-10-13
    • 2013-10-20
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多