【问题标题】:How JPA (Hibernate) deal with transaction when fetching Object from database从数据库中获取对象时 JPA (Hibernate) 如何处理事务
【发布时间】:2010-09-19 17:33:15
【问题描述】:

我目前正在使用 Hibernate 作为持久性管理器和 JPA 作为持久性管理休眠的抽象在 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有什么区别?

谢谢大家, 弗雷德

【问题讨论】:

    标签: java hibernate jpa transactions


    【解决方案1】:

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

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

    要理解的重要一点是,持久性上下文和事务的持续时间可以分开管理。通常,尽管您希望将它们一起管理。

    【讨论】:

    • “如果您开始操作从该方法返回的列表中的对象,[...] 这些更改将通过临时事务传播回数据库。”这适用于 withTransaction 关闭还是两种情况?
    • 如果它适用于这两种情况,并且如果我在函数末尾调用 em.clear() 实体将处于分离模式,并且不会自动发送/提交到数据库。对吧?
    • 或者我应该明白:如果我不在我的选择中强制执行事务并执行更高级别的事务管理(在此功能之外),我将能够包装选择和修改实体都在一个事务中,这将阻止临时(自动提交)模式。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2015-04-28
    相关资源
    最近更新 更多