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

标签 java spring hibernate jpa orm

我有 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/

相关文章:

java - 如何在 spring mvc 中将 .json 映射到 .html url

java - 如何在 REST 架构中使用 Spring 和 Jackson 只请求必要的字段?

java - org.springframework.beans.factory.NoSuchBeanDefinitionException : No bean named 'customerService' is defined

java - 如何从日期选择器获取日期到android中的另一个 Activity

java - 无法从 myFile.jar 错误加载 Main-Class list 属性

java - 复杂的键值对

java - 使用 spring-java-config 创建一个 'decider-step-loop'

java - 如何在Java中创建通用数组?

java - Spring 将entitymanager getResultList结果转换为JSON

spring - Maven + Spring + hibernate : hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException"