我目前正在使用 Hibernate 作为持久性管理器并使用 JPA 作为持久性管理 Hibernate 的抽象来开发 Java 应用程序。
我想知道围绕事务包装结果查询的影响。我知道实体管理器必须对延迟获取的字段错误保持开放状态,这一切中的事务怎么样?
这是一个具有事务激活/停用功能的代码示例。
public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
EntityTransaction tx = null;
try {
if (withTransaction) {
tx = em.getTransaction();
tx.begin();
}
Query query = em.createQuery("from Exportdata");
query.setMaxResults(10);
List<Exportdata> list = query.getResultList();
if (withTransaction)
tx.commit();
return list;
} catch (RuntimeException re) {
if (withTransaction)
if (tx != null && tx.isActive())
tx.rollback();
throw re;
}
}
调用此函数时启用或禁用 withTransaction 有什么区别?
谢谢大家, 弗雷德
最佳答案
这里没有实际差异,因为您没有更改任何数据。您执行的查询将生成 SQL 选择。事务允许您将 ACID 属性应用于插入、更新等集合。
但是,如果您开始操作从此方法返回的列表中的对象,调用 setter 等,这些更改将通过临时事务传播回数据库基础。换句话说,您将有效地在自动提交模式下使用数据库。这不太可能是您想要的。
需要理解的重要一点是,持久化上下文和事务的持续时间可以分开管理。但通常您希望将它们一起管理。
关于java - JPA(Hibernate)从数据库获取对象时如何处理事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245723/