gpt4 book ai didi

java - 具有 JPA 持久性的 Spring 状态机 - 存储库使用

转载 作者:行者123 更新时间:2023-12-04 08:53:07 27 4
gpt4 key购买 nike

我试图弄清楚如何轻松使用 spring 状态机,包括对 JPA 的持久性。
这是我正在处理的问题:
不兼容的数据类型 - 工厂和持久性
在程序的某个时刻,我想使用连接到用户的状态机。有用于此目的的存储库(项目 spring-statemachine-data-jpa)。
首先,使用存储库检查播放器是否已经存在状态机。如果没有,创建一个新的状态机并保持它。
问题是我有不同类型的状态机。工厂创建StateMachine<UserState, UserEvent> ,存储库返回 JpaRepositoryStateMachine .这些彼此不兼容,对我来说不清楚如何持久化/创建/恢复状态机。
你能帮我澄清一下吗?

@Autowired
private StateMachineRepository<JpaRepositoryStateMachine> repository;

public someMethod(User user) {

Optional<JpaRepositoryStateMachine> stateMachine = repository.findById(user.getId()); // JPA state machine

if(stateMachine.isEmpty()) {
StateMachine<UserState, UserEvent> createdStateMachine = factory.getStateMachine(user.getId()); // spring state machine
repository.save(createdStateMachine); // compile error
}

// here: ready-to-use statemachine - how?

}
谢谢你的帮助!

最佳答案

尝试使用 SpringStateMachineService获取状态机实例,而不是从存储库或工厂中显式检索它。您可以使用 default Spring提供的实现:

@Bean
public StateMachineService<State, Event> stateMachineService(
final StateMachineFactory<State, Event> stateMachineFactory,
final StateMachinePersist<WorkflowState, WorkflowEvent, String> stateMachinePersist) {
return new DefaultStateMachineService<>(stateMachineFactory, stateMachinePersist);
}
因此,您的代码将如下所示:
@Autowired
private StateMachineService<State, Event> stateMachineService;

public someMethod(User user) {
StateMachine<State, Event> stateMachine = stateMachineService.acquireStateMachine(user.getId(), false);

// here: ready-to-use statemachine - call stateMachine.start() for example

}
如果你进入 acquireStateMachine方法你可以看到它通过 id 从存储库查询状态机,如果没有找到,则创建一个新的。
您可以使用 JpaPersistingStateMachineInterceptor在每次更改时隐式保存和更新状态机实例。
@Bean
public JpaPersistingStateMachineInterceptor<State, Event, String>
jpaPersistingStateMachineInterceptor() {
return new JpaPersistingStateMachineInterceptor(stateMachineRepository);
}
Persisting State Machine

关于java - 具有 JPA 持久性的 Spring 状态机 - 存储库使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63984734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com