2010-10-20 89 views
4

我想在JPA中实现状态设计模式。我目前正在做这件事的方式在这个blog post列出。如何在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); 
    } 
    } 
} 

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

感谢, 西奥

回答

0

那么这是一个老问题,但对于那些谁可以搜索归档的缘故 - 我用弹簧状态机使用枚举(而不是字符串)。

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

1.1.0.RELEASE给出了一个默认机制来保持一个状态persisting StateMachineContext,另一个使用persist recipe

现在引用JPA - 可能会有实体监听器初始化postload(@Postload)上的状态机,我认为这不是一条好路径。