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 域模型中实现状态设计模式?
嗯,这是一个老问题,但是为了那些可能搜索档案的人 - 我使用了带有枚举(而不是字符串)的 spring 状态机。
关于处理转换,有一些注释允许在转换发生时调用您的函数。
1.1.0.RELEASE 提供了通过持久化 StateMachineContext来持久化状态的默认机制,以及使用持久配方的替代方案。
现在参考 JPA - 可以有实体监听器在加载后初始化状态机(@Postload),我认为这不是一个好的路径。
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |