gpt4 book ai didi

java - JPA 实体中的预加载/加载后更新

转载 作者:行者123 更新时间:2023-11-30 03:38:35 24 4
gpt4 key购买 nike

我有 Spring Data JPA 和 Hibernate 项目。

有两个 JPA 实体 - 用户和作业。每个用户有多个工作。每个作业都有状态字段。创建新作业时,会向远程服务器发送新请求,并以“IN PROGRESS”状态保存作业。

可以使用其 ID 从远程服务器查询更新后的状态。请求的业务逻辑应该是始终返回存储的状态,但是当作业处于 IN PROGRESS 状态时,应该查询远程服务器以获取更新的状态,并在之后存储该状态。

应该解释我的意图的伪代码:

@Entity
class User {
private long id;
private String username;
private Collection<Jobs> jobs;
}

@Entity
class Job {
private long id;
private User user;
private Status status;
@Inject
private JobRepository jobRepository;

@PrePersist
private setDefaultStatus() {
status = IN_PROGESS;
}

@PostLoad
private checkUpdatedStatus() {
if (this.status == IN_PROGESS) {
this.status = askRemoteServerForJobStatus(this.id);
jobRepository.save(this);
}
}
}

伪代码用法:

userRepsitory.find(1).jobs // should trigger checkUpdatedStatus
jobsRepository.findAll() // should trigger checkUpdatedStatus

我认为在 Job 实体中包含 jobRepository 依赖项(如伪代码所示)并不是一个好的做法,因此我当前的实现在存储库中完成了所有这些工作 - 我有像 findAll() 这样的方法,它将调用类似 PostLoad/checkUpdatedStatus 的方法。但我也从所有其他存储库调用此方法,例如用户存储库,它也获取作业项目。

在我看来,这是一个非常合理的用例,所以我不相信,没有更好的方法可以做到这一点。有人已经做过类似的事情了吗?如果您能让我走上正轨,我会非常高兴。

谢谢你,弗拉斯蒂克兹

最佳答案

将存储库注入(inject)实体并不是一个好的举措。实体是持久结构,存储库应该管理实体,而不是相反。考虑事务划分和 transient /分离实例。

有一种更好的方法可以在添加实体时调用特定登录。您可以使用 e vent listener for this 。您可以配置一个负载监听器,它也是一个 Spring bean,因此您可以在此监听器中注入(inject)其他服务/存储库。

关于java - JPA 实体中的预加载/加载后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27293367/

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