Java 方法完成时Spring EntityManager提交事务

Java 方法完成时Spring EntityManager提交事务,java,spring,entitymanager,propagation,Java,Spring,Entitymanager,Propagation,我正在使用springEntityManager,需要在方法完成时提交记录。也就是说,我有两种方法用于ex:: @Override @Transactional public void upsert(String lastSuccessfullRun) { for( tableData in Tables){ insertIntoDB(tableData); } } 方法insertIntoDB包含实际执行更新查询

我正在使用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方法中的下一个循环时不会提交

如何在方法完成时提交?

请检查

方法可见性和@Transactional

使用代理时,应应用@Transactional注释 仅适用于具有公共可见性的方法。如果您确实注释了protected, 带有@Transactional注释的私有或包可见方法, 不会引发错误,但带注释的方法不会显示 已配置事务设置。考虑AspectJ的使用(参见 下面)如果需要注释非公共方法

即使您的方法是公共的,您也在同一类中的另一个方法中调用它,因此您不会尝试使用代理,而
@Transactional(propagation=propagation.REQUIRES_NEW)
上的
insertIntoDB
方法无效


因此,请在AspectJ模式下尝试,如文档中所示。

尝试使用,如下所示:

@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方法完成时提交该事务。

@Transactional仅在调用方法throw proxy时起作用,因此在您的情况下它不起作用。若您确实希望您的更改反映在数据库和与活动事务关联的PersistenceContext中,那个么您可以使用

EntityManager.flush();

但是,在使用flush()时请记住,在遇到flush后,数据的更改会反映在数据库中,但它仍然处于事务中,可以回滚,事务仍然处于活动状态,但使用commit()时,对数据库的更改也会结束。

在持久化之后,你能试试
entityManager.getTransaction().commit()吗,也可以批量提交,而不是针对每个对象提交,如果有多个对象。@NayanWadekar因为我使用的是Spring EntityManager,所以无法使用
getTransaction()
方法,因为事务无法在Spring容器外管理。很抱歉,Spring中没有太多内容,这似乎很相似——如果我使用一个内部类,那么它会工作吗?我的意思是相同的代理机制会工作吗?@Anand j。卡迪不确定。。。你必须试一试。