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

标签 java hibernate jpa transactions

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

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

关于java - JPA(Hibernate)从数据库获取对象时如何处理事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245723/

相关文章:

java - IntelliJ 优化导入增加空间

java - 哪里可以获得最新的 Google 云存储客户端

java - HQL 连接多个表,应该返回什么?

java - 将 hibernate 数据类型映射到混合类型存储过程的输出

java - 使用 Hibernate 多对多连接表中再添加一列

java - Hibernate 不在反面缓存我的 OneToOne 关系

java - 谷歌应用引擎: 1000 records limit still present with JPA?

java - 具有不同布局参数的 RecyclerView.Adapter 项目

java - 为什么即使值没有改变,JPA 也会将对象标记为脏对象?

java - Platform.RunLater 类似基于 JFXAT PlatformImpl 的行为线程实现来投入工作