我目前正在使用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等,这些更改将被传播回数据库 - 在ad-hoc上进行事务处理基础。换句话说,您将在自动提交模式下有效地使用数据库。这不太可能是你想要的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top