Java JPA(Hibernate)从数据库获取对象时如何处理事务

Java JPA(Hibernate)从数据库获取对象时如何处理事务,java,hibernate,jpa,transactions,Java,Hibernate,Jpa,Transactions,我目前正在用java开发一个应用程序,使用Hibernate作为持久性管理器,使用JPA作为持久性管理Hibernate的抽象 我想知道围绕事务包装结果查询的影响。我知道实体管理器必须对延迟获取的字段bug保持开放,那么在所有这些情况下,事务又如何呢 下面是一个具有事务激活/取消激活功能的代码示例 public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) { Enti

我目前正在用java开发一个应用程序,使用Hibernate作为持久性管理器,使用JPA作为持久性管理Hibernate的抽象

我想知道围绕事务包装结果查询的影响。我知道实体管理器必须对延迟获取的字段bug保持开放,那么在所有这些情况下,事务又如何呢

下面是一个具有事务激活/取消激活功能的代码示例

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;
    }
}
公共列表获取(最大整数、EntityManager em、布尔withTransaction){
EntityTransaction tx=null;
试一试{
if(withTransaction){
tx=em.getTransaction();
tx.begin();
}
Query Query=em.createQuery(“来自Exportdata”);
query.setMaxResults(10);
List=query.getResultList();
if(withTransaction)
tx.commit();
退货清单;
}捕获(运行时异常re){
if(withTransaction)
如果(tx!=null&&tx.isActive())
tx.回滚();
投掷re;
}
}
调用此函数时启用或禁用withTransaction有什么区别

谢谢大家,
Fred

这里没有实际的区别,因为您没有更改任何数据。您执行的查询将生成一个SQL select。事务允许您将ACID属性应用于插入、更新等集合


但是,如果您开始操作此方法返回的列表中的对象、调用setter等,则这些更改将通过临时事务传播回数据库。换句话说,您将在自动提交模式下有效地使用db。这不太可能是你想要的


需要理解的重要一点是,持久性上下文和事务的持续时间可以单独管理。通常情况下,虽然您希望将它们一起管理。

这里没有实际区别,因为您没有更改任何数据。您执行的查询将生成一个SQL select。事务允许您将ACID属性应用于插入、更新等集合


但是,如果您开始操作此方法返回的列表中的对象、调用setter等,则这些更改将通过临时事务传播回数据库。换句话说,您将在自动提交模式下有效地使用db。这不太可能是你想要的


需要理解的重要一点是,持久性上下文和事务的持续时间可以单独管理。通常情况下,您希望同时管理这些对象。

“如果您开始操作此方法返回的列表中的对象,[…]这些更改将通过临时事务传播回数据库。”这适用于关闭事务的情况还是两种情况?如果这两种情况都适用,如果我在函数末尾调用em.clear(),那么实体将处于分离模式,不会自动向db发送/提交任何内容。对吗?或者我应该理解:如果我不在我的选择中强制执行事务,并在更高级别上执行事务管理(此功能之外),那么我将能够将实体的选择和修改全部包装在一个事务中,这将阻止特殊(自动提交)模式。“如果您开始操作此方法返回的列表中的对象,[…]这些更改将通过一个临时事务传播回数据库。”这是否适用于关闭的withTransaction,还是适用于这两种情况?如果它同时适用于这两种情况,并且如果我调用em.clear()在功能结束时,实体将处于分离模式,不会自动向db发送/提交任何内容。对吗?或者我应该理解:如果我没有在我的选择中强制执行事务,并执行更高级别的事务管理(此功能之外)然后,我将能够将实体的选择和修改都包装在一个事务中,这将防止临时(自动提交)模式。