手动管理的交易

时间:2016-11-21 15:53:32

标签: java hibernate ejb

我有一个代码,用于手动完成事务控制, 但是代码调用同一应用程序的其他EJB的方法,其中事务不是手动控制的,例如,有些方法使用由Container管理的Hibernate Session。

如果存在使用例如Session.createCriteria的查询方法,如何防止我的手动管理的事务下载提交。

发生这种情况时,我的事务会在我的进程实际完成之前卸载提交。

示例

private void exe() throws Exception {
   @EJB Businessbusiness;
       this.beginTransaction();
            business.processar(); // Exemplo
        this.commit();
    }


@Stateless
public class Business() {
    @EJB 
    private DAO dao;

    private void processar() throws Exception {
     // executando processo 1
      this.save();

      // executando processo 2
      this.update();

      // Saving and updating has not yet been committed. So far it is correct.

     Teste = dao.buscarTeste(1L);

     // Here, after performing the search, my transaction downloads the commit to the bank without completing the whole process.
    }
}

@Stateless
public class DAO() {
     public Teste buscarTeste(Long codigo) {

        Criteria cri = getSession().createCriteria(Teste.class);

        cri.add(Restrictions.eq("codigo", codigo)); 

        return (Teste) cri.uniqueResult();
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定我是否真的明白你的观点。

但假设您没有收到任何错误,当您调用Business.processar()方法时,它会继承该事务。在exe客户端提交之前,它仍处于“待定”状态。

所以,我会调查你的getSession()中间做了什么,我很确定它会启动一个全新的交易,它会检索未提交的数据。

顺便说一句,是否有理由使用hibernate代替JPA和hibernate作为具体实现?