我对EJB,JTA,Hibernate环境中的JDBC连接,事务及其集成有一点困惑。我的怀疑是:
当我们使用@Resource DataSource ds时; ... ... ds.getConnection(),我们是否在托管bean使用的同一个事务中工作?我们应该关闭连接,语句,结果集吗?
session.doWork怎么样?我们在同一笔交易中吗?关闭语句和结果集怎么样?
Hibernate中的主动释放模式意味着在每个语句后关闭连接。这是否也意味着交易? (我不认为这是真的,但我无法理解Hibernate如何在这里工作)
答案 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