在@Transactional交易期间提交

Mic*_*l Z 4 spring hibernate jpa transactions transactional

是否可以在标记为Spring的@Transactional的方法中执行提交?

@PersistenceContext
private EntityManager em;

@Transactional(propagation = Propagation.REQUIRED)
public void saveMembersWithMultipleCommits(List<Member> members)
    throws HibernateException
{
    Iterator<Member> it = members.iterator();
    while (it.hasNext())
    {
        while (it.hasNext())
        {
            Member wsBean = it.next();
            em.persist(wsBean); // overall commit will be made after method exit
            log.info("Webservices record " + wsBean + " saved. " + i++);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在说出每500个项目之后提交DB.这可能与上述背景有关吗?

Ale*_*nes 5

您的问题表明您错放了交易边界.

您可以将持久调用移动到私有方法中,并使该方法为事务性而非外部方式.此方法一次可以接受500个成员,然后在退出时提交.

  • 需要加载时或编译时编织,不能与Springs"标准"基于代理的编织一起使用. (7认同)

pap*_*pap 5

不,您需要以编程方式使用,例如,TransactionTemplateAPI.在这里阅读更多.

它看起来像

while (it.hasNext())
{
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            int counter = 0;
            while (it.hasNext() && counter++ < 500) {
                Member wsBean = it.next();
                em.persist(wsBean);
                log.info("Webservices record " + wsBean + " saved. " + i++);
            }
        }
    );
}
Run Code Online (Sandbox Code Playgroud)