Hibernate 和 EJB:如何正确使用@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)?

Hibernate and EJB: how to correctly use @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)?

我有以下代码,我希望在方法中保留 all 或 none entities

但是,一些 entities 已创建而另一些未创建 - 即整个 transaction 未被回滚。

为什么会这样?

注意 - 我是 运行 我的代码作为 JBOSS EAP 服务器

中的 EAR 文件
  @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
  public void createCompanyStatuses(String client, CompanyStatusPostDTO companyStatusPostDTO) {
    
            EntityManager entityManager = null;
    
            try {
    
                CompanyStatus companyStatus = new CompanyStatus();
                companyStatus.setCompanyLabel(candidateMaskedStatusPostDTO.getCompanyLabel());
    
                entityManager = entityManagement.createEntityManager(client);
                entityManager.persist(companyStatus);
    
                for(Integer employeeStatusId: companyStatusPostDTO.getEmployeeStatuses()){
    
                    CompanyStatusEmployeeStatus companyStatusEmployeeStatus = new CompanyStatusEmployeeStatus();
                    companyStatusEmployeeStatus.setEmployeeId(employeeStatusId);
                    companyStatusEmployeeStatus.setCompanyId(companyStatus.getCompanyId()); //todo - how will get this?
                    entityManager.persist(CompanyStatusEmployeeStatus);
                }
    
            } catch(Exception e){
                log.error("An exception has occurred in inserting data into the table" + e.getMessage(), e);
            } finally {
                entityManagement.closeEntityManager(client, entityManager);
            }
    }

答案对Hibernate有效。

TransactionAttributeType.REQUIRES_NEW 不支持。

很难在 java 对象上实现回滚。想象一下以下情况:

  1. 交易开始
  2. 创建并保存对象
  3. 子交易开始
  4. 对象已修改
  5. 子事务回滚。

您希望对象处于子事务开始之前的状态,因此您需要跟踪有关子事务中该对象修改的信息以及回滚这些修改的能力。

或者您可以从数据库重新加载状态,但您需要跟踪哪个对象属于哪个事务。

我假设开发人员只是认为付出太多而收效甚微。