首页 > 解决方案 > 在 JPA 中保存具有一对一关系的实体

问题描述

我有一个实体Request

@Entity
public class Request {

    @Id
    @GeneratedValue
    private Long id;

    @OneToOne
    private Candidate candidate;

    ...
}

要创建上述实体并将其保存到 JPA 存储库中,我将执行以下操作:

Candidate candidate = candidateRepository.findById(requestUpdate.getCandidate()).orElse(null);

Request request = new Request(candidate);
Request save = requestRepository.save(request);

由于RequestDB 中的表为候选人存储 FK,我认为设置一个 id 就足够了。但是 JPA 希望我设置候选对象。这迫使我查询候选存储库。

是否需要从候选存储库中查询候选以保存Request 或者如果我有可用的候选 ID,我不能直接设置它吗?

标签: javaspringjpaspring-data-jpahibernate-mapping

解决方案


您需要使用EntityManager#getReferenceJpaRepository#getOne。它不会从数据库中获取整个实体,而是将您已经拥有的 id 包装到代理中以同步关系:

Candidate candidate = candidateRepository.getOne(requestUpdate.getCandidate());

Request request = new Request(candidate);
Request save = requestRepository.save(request);

推荐阅读