JPA(Hibernate)如何在从数据库中获取Object时处理事务

Fre*_*rin 0 java hibernate jpa transactions

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

我想知道在事务中包装结果查询的影响.我知道实体经理必须保持开放,因为懒惰地获取了所有这些事务中的事务错误?

这是一个具有事务激活/停用功能的代码示例.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

调用此函数时启用或禁用withTransaction有什么区别?

谢谢大家,弗雷德

joh*_*tok 5

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

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

需要了解的重要一点是,持久化上下文和事务的持续时间可以单独管理.通常你会想要一起管理它们.