在 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#getReference
或JpaRepository#getOne
。它不会从数据库中获取整个实体,而是将您已经拥有的 id 包装到代理中以同步关系:
Candidate candidate = candidateRepository.getOne(requestUpdate.getCandidate());
Request request = new Request(candidate);
Request save = requestRepository.save(request);
【讨论】:
感谢您的回答。这适用于简单的实体。对于嵌套关系的实体,在反序列化过程中会报错***.com/questions/52656517/… @OmkargetOne
或 getReference
没有问题。您只是在某处映射错误以上是关于在 JPA 中保存具有一对一关系的实体的主要内容,如果未能解决你的问题,请参考以下文章
JPA+Hibernate - 实体关系中的循环 - 级联策略