我目前正在用java开发一个应用程序,使用Hibernate作为持久性管理器,JPA作为持久性管理hibernate的抽象.
我想知道在事务中包装结果查询的影响.我知道实体经理必须保持开放,因为懒惰地获取了所有这些事务中的事务错误?
这是一个具有事务激活/停用功能的代码示例.
public Listget(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 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等,那么这些更改将在特定的基础上通过事务传播回数据库.换句话说,您将在自动提交模式下有效地使用数据库.这不太可能是你想要的.
需要了解的重要一点是,持久化上下文和事务的持续时间可以单独管理.通常你会想要一起管理它们.