在EJB-Hibernate环境中使用JDBC

时间:2011-03-05 15:44:58

标签: java hibernate jdbc transactions ejb

我对EJB,JTA,Hibernate环境中的JDBC连接,事务及其集成有一点困惑。我的怀疑是:

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

  2. session.doWork怎么样?我们在同一笔交易中吗?关闭语句和结果集怎么样?

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

1 个答案:

答案 0 :(得分:0)

您需要弄清楚一些事情。首先,您需要确定您的工作单位。 每个请求的会话模式是最常用的模式之一,除非您有特定的需求。 如果您使用的是Hibernate,则不要直接使用语句和结果集。 Hibernate将为您做到这一点。您需要关闭的是休眠会话

您使用的是SessionFactory和Session对象。会议几乎代表了您的工作单位。在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
}

所以回答你的问题:

如果你在容器中使用带有JTA的Hibernate,最好使用JPA EntityManager或spring 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