2016-08-02 318 views
0

我正在使用弹簧EntityManager并且需要提交方法完成记录。这就是我对前::Spring EntityManager提交事务作为方法完成

@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方法中返回下一个循环。

我该如何提交方法完成?

+0

经过坚持,你可以尝试'entityManager.getTransaction()。commit();',你也可以批量提交,而不是每个对象,如果有几个。 –

+0

@NayanWadekar由于我使用的是Spring EntityManager,我不能使用'getTransaction()'方法,它会抛出异常,因为在spring容器之外无法管理事务。 –

+0

对不起,Spring并没有太多,这似乎相似 - http://stackoverflow.com/q/12897882/366964 –

回答

2

检查documentation

方法的知名度和@Transactional

当使用代理服务器,你应该应用@Transactional注解 只与公众知名度的方法。如果使用@Transactional注释 注释受保护的 私有或包可见方法,则不会引发错误,但带注释的方法不会显示配置的事务设置 。如果您需要注释非公共方法,请考虑使用AspectJ(请参阅下面的 )。

即使你的方法是公共的,你调用它在同一类的另一种方法,这样你就不会trugh代理和@Transactional(propagation=Propagation.REQUIRES_NEW)insertIntoDB方法没有效果。

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

+0

如果我使用内部类,那么它会工作,我的意思是相同的代理机制? –

+0

@Anand j。 Kadhi不确定...你必须尝试。 –

0

尝试使用,如下图所示:

@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.REQUIRES_NEW”

那么它会创建一个新的事务并提交时insertIntoDB方法完成。

0

@Transactional只有当你调用方法抛出代理,所以在你的情况下它不起作用。如果你真的想你的变化体现在数据库中,以你的活动事务相关的PersistenceContext可以使用

EntityManager.flush(); 

但是在使用冲洗时(记住这一点)的数据更改反映在数据库之后遇到刷新,但它仍然处于事务中,并且可以回滚并且事务仍处于活动状态,但是当您使用commit()时,更改将进入数据库&事务也会在那里结束。

相关问题