2

情况

想象一下:

有一个这样的枚举:

enum State{
  INITIAL{
    @Override
    public void proceed(){...}
  },
  NEXT_STATE{
    @Override
    public void proceed(){ ... }
  },
  //and so on
  TERMINATED;

  public void proceed(){}
}

然后有一个@Entity。该实体表示处理订单的应用程序中的用例。让我们称之为ActivationUseCaseActivationUseCase(就像从我的基类继承的任何其他类一样UseCase)有一个名为 state 的属性,其中包含一个State.

最后一个问题是一个 EJB 3.1 bean,它检索一个ActivationUseCase并在其上调用proceed()。

这个想法是让@Entity持有所有关于它的可能状态(枚举)的信息,并且每个状态都知道当它必须做什么时该做什么.proceed()

问题

在proceed() 方法中,我们有一个静态上下文。但我们可能想调用其他 EJB。所以有人开始做 JNDI 查找(本地)并调用我们需要的 bean。恕我直言,这非常丑陋和危险,但这不是这里的问题。

为了清楚起见,这里有一堆伪调用:

    MyServiceBean.myServiceMethod()
    |- ActivationUseCase.proceed()
       |- ManuallyLookedUpEJB.anotherServiceMethod()

所以MyServiceBean.myServiceMethod()启动一个事务,检索ActivationUseCase实例以调用proceed()它。然后我们查找ManuallyLookedUpEJB(new InitialContext()...) 并调用anotherServiceMethod().

问题

交易会发生什么?它从哪里开始?会覆盖anotherServiceMethod()吗?我该如何调试这个?

免责声明

我不想讨论 enum-contains-logic 构造(现在)。事实上,我正在收集重构(重写)整个事情的原因。我只需要一些理由来支持我的说法,即这种结构不是一个好主意。

4

1 回答 1

1

事务将像任何其他方法调用一样传播。因此,除非ManuallyLookedUpEJB.anotherServiceMethod()有 REQUIRES_NEW 事务传播,否则它将在与启动的事务相同的事务中执行MyServiceBean.myServiceMethod()

于 2013-04-08T13:37:44.937 回答