如何在 JPA 领域模型中实现状态设计模式

The*_*heo 5 java design-patterns jpa aspectj

我想在 JPA 中实现状态设计模式。这篇博文中概述了我目前的做法。

作者使用包含所有可用状态实现的枚举,而不是为状态抽象创建抽象类/接口并为每个状态编写实现。我发现这种方法非常有用,因为枚举可以在 JPA 中轻松序列化,并且您可以无需额外工作即可存储对象的当前状态。我还将状态接口和所有状态类嵌套到枚举中,使它们成为私有的,因为它们是特定于实现的,不应该对任何客户端可见。这是枚举的代码示例:

public enum State {

  STATE_A(new StateA()),
  STATE_B(new StateB());

  private final StateTransition state;

  private State(StateTransition state) {
     this.state = state;
  }

  void transitionA(Context ctx) {
    state.transitionA(ctx);
  }

  void transitionB(Context ctx) {
     state.transitionB(ctx);
  }

  private interface StateTransition {

    void transitionA(Context ctx);

    void transitionB(Context ctx);
  }

  private static class StateA implements StateTransition {

    @Override
    public void transitionA(Context ctx) {
        // do something
    ctx.setState(STATE_B);
    }

    @Override
    public void transitionB(Context ctx) {
        // do something
    ctx.setState(STATE_A);
    }
  }

  private static class StateB implements StateTransition {

    @Override
    public void transitionA(Context ctx) {
    throw new IllegalStateException("transition not allowed");
    }

    @Override
    public void transitionB(Context ctx) {
        // do something
    ctx.setState(STATE_A);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想和你分享这个,并得到你的想法。你觉得这有用吗?您将如何在 JPA 域模型中实现状态设计模式?

Pet*_*tar 0

嗯,这是一个老问题,但是为了那些可能搜索档案的人 - 我使用了带有枚举(而不是字符串)的 spring 状态机。

关于处理转换,有一些注释允许在转换发生时调用您的函数。

1.1.0.RELEASE 提供了通过持久化 StateMachineContext来持久化状态的默认机制,以及使用持久配方的替代方案。

现在参考 JPA - 可以有实体监听器在加载后初始化状态机(@Postload),我认为这不是一个好的路径。