java - 嵌套 session /事务中的 Transaction.rollback 会发生什么?

标签 java hibernate jpa transactions

考虑这两个类:EmployeeDetailDAOImpl 和 EmployeeDAOImpl。假设如果我想创建一个新员工,我还应该为 EmployeeDetail 创建一条新记录。

考虑到下面的实现,我想知道如果在detailDAO.create(employeeId)调用后发生任何异常,外部事务(EmployeeDAOImpl的tx)被回滚,那么new EmployeeDetail的事务也会被回滚吗?

public class SessionHandler {
    public static getSession() {
        return Configuration.buildSessionFactory().openSession(); //ignore the isConnected or other exception handling for now
    }
}

public class EmployeeDetailDAOImpl {
    public void create(Serializable employeeId) {
        Session session = SessionHandler().getSession();
        Transaction tx = session.beginTransaction();
        try {
            EmployeeDetail detail = new EmployeeDetail(employeeId);
            session.save(detail );
        } catch (Exception e) {
            if (tx!= null) {
                tx.rollback;
            }
        }
        session.close();
    }
}

public class EmployeeDAOImpl {
    public void add(String name) {
        Session session = SessionHandler().getSession();
        Transaction tx = session.beginTransaction();
        try {
            Employee employee = new Employee(name);
            Serializable employeeId= session.save(employee);
            EmployeeDetailDAOImpl detailDAO = new EmployeeDetailDAOImpl();
            detailDAO.create(employeeId);
            //more things here, that may through exceptions.
        } catch (Exception e) {
            if (tx!= null) {
                tx.rollback;
            }
        }
        session.close();
    }
}

最佳答案

实际上,给出的答案都不是 100% 正确的。

这取决于调用方/服务。

如果您从 EJB 调用方法,则将有 1 个事务涵盖这两个方法调用。这样,如果发生异常,事务将回滚这两个操作。这背后的原因是 EJB 中的每个方法都是事务必需的,除非在注释或 ejb 部署描述符中另有指定。

如果您使用 spring 或任何其他 DI 框架,那么这取决于您的配置。在正常设置中,您的调用事务将被挂起,因为 JPA EJB 将创建自己的事务。不过,您可以使用 JTATransactionManager ( As specified here ) 来确保您的 EJB 和 Spring bean 共享相同的事务。

如果您从 POJO 调用 JPA 方法,那么您必须自己处理 JTA 事务。

关于java - 嵌套 session /事务中的 Transaction.rollback 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42779540/

相关文章:

java - Struts2 CRUD 删除不起作用

spring-boot - 表达式为空会导致 native 查询出现异常

java - JPA findAll 可分页请求总数按列分组

java - 如何使用 JDOM 将独立的 ="no"添加到文件?

Java+ hibernate : Fire property change events when object retrieved from database

java - 我可以通过 JNI 从 Java 调用的 EPoll C 实现

java - hibernate : Generic JDBC exception - Bad format for Time '838:59:59'

java - 我在哪里可以找到 Hibernate-JPA jar 的 javadoc

java - 如何在JPA中有效地截断多对多表?

java - 第一个排序属性必须与应用不等式过滤器的属性相同