【问题标题】:how can i get a isolate transaction on EJB?如何在 EJB 上获得隔离事务?
【发布时间】:2016-09-02 08:14:11
【问题描述】:

我有以下 EJB 会话 bean:

@Stateless
public class FacadeBean implements FacadeBeanRemote {
    @PersistenceContext(unitName = "ejercicio7PU")
    private EntityManager em;

    @Override
    public void insertar(final long id) {
        Record r = new Record();
        r.setId(id);
        em.persist(r);
    }

    @Override
    public void insertarTres(final long id1, final long id2, final long id3) {
        Logger.getLogger(FacadeBean.class.getName()).log(Level.INFO, "Insertando registros");
        insertar(id1);
        insertar(id2);
        insertar(id3);
    }

}

记录实体如下:

@Entity
public class Record implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Record{" + "id=" + id + '}';
    }

}

我在独立的 java 应用程序上调用远程方法来插入三个数字:

 ejb.insertarTres(1l, 2l, 3l);

现在,当我再次使用以下数字调用远程方法时,我想要它:

ejb.insertarTres(4l, 5l, 3l);

即使数字 3 发生异常,数字 4 和 5 也会被保存。

我尝试用

设置插入方法
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

但它不适合我的

【问题讨论】:

  • 哎呀忘了在之前的评论中添加一些东西,我的意思是无论你在哪里调用 insertarTres(),都要单独调用它。
  • 您需要获取对 EJB 的引用,因为仅调用该方法不会应用正确的事务上下文。在@Gimby 的链接中查看建议的答案

标签: jakarta-ee ejb-3.0 jta


【解决方案1】:

您必须使用sessionContext.getBusinessObject (FacadeBeanLocal.class);
获取另一个 bean 实例以应用 REQUIRE_NEW

@Stateless
public class FacadeBean implements FacadeBeanRemote {
    @PersistenceContext(unitName = "ejercicio7PU")
    private EntityManager em;
    @Resource
    private SessionContext sessionContext;

    private FacadeBeanLocal local;

    @PostConstruct
    void init() {
      local = sessionContext.getBusinessObject(FacadeBeanLocal.class);
     }

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void insertar(final long id) {
        Record r = new Record();
        r.setId(id);
        em.persist(r);
    }

    @Override
    public void insertarTres(final long id1, final long id2, final long id3) {
        Logger.getLogger(FacadeBean.class.getName()).log(Level.INFO, "Insertando registros");
        local.insertar(id1);
        local.insertar(id2);
        local.insertar(id3);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2011-09-30
    • 2015-06-14
    相关资源
    最近更新 更多