Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate和EJB:如何正确使用@TransactionaAttribute(value=TransactionaAttribute.etype.REQUIRES\u NEW)?_Java_Mysql_Hibernate_Jboss_Transactions - Fatal编程技术网

Java Hibernate和EJB:如何正确使用@TransactionaAttribute(value=TransactionaAttribute.etype.REQUIRES\u NEW)?

Java Hibernate和EJB:如何正确使用@TransactionaAttribute(value=TransactionaAttribute.etype.REQUIRES\u NEW)?,java,mysql,hibernate,jboss,transactions,Java,Mysql,Hibernate,Jboss,Transactions,我有以下代码,我希望在方法中保留实体的全部或无 但是,它的行为是创建一些实体,而其他实体不创建,即整个事务没有回滚 为什么会这样 注意-我将代码作为JBOSS-EAP服务器中的EAR文件运行 @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) public void createCompanyStatuses(String client, CompanyStatusPostDTO companyStat

我有以下代码,我希望在方法中保留
实体的全部或无

但是,它的行为是创建一些
实体
,而其他实体不创建,即整个
事务
没有回滚

为什么会这样

注意-我将代码作为
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);
            }
    }

回答对休眠有效

TransactionAttributeType.REQUIRES\u不支持新建

很难在java对象上实现回滚。想象一下这样的场景:

  • 交易开始了
  • 创建并保存的对象
  • 子交易已开始
  • 对象修改
  • 子事务回滚
  • 您希望对象处于子事务开始之前的状态,所以您需要跟踪子事务中该对象的修改信息以及回滚这些修改的能力

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


    我假设开发人员认为这是一件事半功倍的事。

    谢谢你的回答,我现在的代码不可能实现任何形式的回滚吗?thanksAFAIK子事务不受任何形式的支持。所以你需要改变你的算法。您可以尝试在不同的线程中启动整个新事务,但请记住,回滚当前事务不会影响在新事务中所做的数据库更改(并且您可能会遇到一些并发问题),我的意思是以不需要子事务的方式重写代码。