【问题标题】:Saving an entity with one-to-one relation in JPA在 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,我不能直接设置吗?

【问题讨论】:

  • 也许你需要延迟加载?

标签: java spring jpa spring-data-jpa hibernate-mapping


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。这适用于简单的实体。对于嵌套关系的实体,在反序列化过程中会报错stackoverflow.com/questions/52656517/…
  • @Omkar getOnegetReference 没有问题。您只是在某处映射错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2012-09-29
  • 2012-11-25
  • 2014-04-28
相关资源
最近更新 更多