Java 方法完成时Spring EntityManager提交事务
我正在使用springJava 方法完成时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包含实际执行更新查询
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。卡迪不确定。。。你必须试一试。