2010-10-20 152 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)上的狀態機,我認爲這不是一條好路徑。