Spring EntityManager Commit Transaction作为方法完成

时间:2016-08-02 12:41:16

标签: java spring entitymanager propagation

我正在使用spring EntityManager并要求提交方法完成记录。那是我有两个ex ::

的方法
    @Override
    @Transactional
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }

并且方法insertIntoDB包含实际执行更新查询的商务逻辑

    @Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

但问题是方法没有提交,因为它返回upsert方法中的下一个循环。

我如何提交方法完成?

3 个答案:

答案 0 :(得分:2)

检查documentation

  

方法可见性和@Transactional

     

使用代理时,应该应用@Transactional注释   仅限具有公众可见度的方法。如果你做注释保护,   使用@Transactional注释的私有或包可见方法,   没有引发错误,但带注释的方法没有出现错误   配置的事务设置。考虑使用AspectJ(参见   如果你需要注释非公开方法。

即使您的方法是公开的,您也是在同一个类中的另一个方法中调用它,因此您不会使用代理并且@Transactional(propagation=Propagation.REQUIRES_NEW) insertIntoDB方法无效。

所以在AspectJ模式下尝试,就像在文档中一样。

答案 1 :(得分:1)

尝试使用如下所示:

@Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }



@Override
    @Transactional(propagation=Propagation.SUPPORTS)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

如果在insertIntoDB方法中使用“propagation = Propagation.REQUIRES_NEW”,那么它将创建一个新事务并在insertIntoDB方法完成时提交它。

答案 2 :(得分:0)

@Transactional仅在您调用方法throw代理时才有效,因此在您的情况下它不起作用。如果您真的希望您的更改反映在与您的活动事务关联的数据库和PersistenceContext中,您可以使用

EntityManager.flush();

但是在使用flush()时请记住,数据的更改在遇到flush后会反映在数据库中,但它仍然在事务中并且可以回滚并且事务仍处于活动状态但是当你使用commit()时更改进入数据库&交易也在那里结束。