在 JPA 中保存具有一对一关系的实体

Posted

技术标签:

【中文标题】在 JPA 中保存具有一对一关系的实体【英文标题】:Saving an entity with one-to-one relation in JPA 【发布时间】:2021-03-27 18:12:36 【问题描述】:

我有一个实体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);

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

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

【问题讨论】:

也许你需要延迟加载? 【参考方案1】:

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

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

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

【讨论】:

感谢您的回答。这适用于简单的实体。对于嵌套关系的实体,在反序列化过程中会报错***.com/questions/52656517/… @Omkar getOnegetReference 没有问题。您只是在某处映射错误

以上是关于在 JPA 中保存具有一对一关系的实体的主要内容,如果未能解决你的问题,请参考以下文章

JPA查询一对一关系

JPA的一对多,多对多用法

关于JPA一对一,一对多(多对一),多对多的详解

JPA+Hibernate - 实体关系中的循环 - 级联策略

外键在一对多关系中始终为空 - Spring Boot Data with JPA

JPA映射关系