如何在不加载 JPA 中的相关实体的情况下保存具有外键的实体?

2022-09-02 22:00:19

我有两个实体:

Account {
  @Id
  Long id;
}

Preference {
  ...
  @ManyToOne
  private Account account;
}

保存首选项时,我有 accountId,但没有账户实体。在这种情况下,我应该如何保存首选项?

加载帐户实体并将其设置为首选项?对我来说,这似乎是对数据库的错误访问。

具有可持久保存的 accountId 字段,并将“帐户”字段设为只读?同时具有 accountId 字段和 Account 字段似乎都是多余的?

使用 NamedQuery 来保留首选项?我希望只是一般地保存一个没有特殊逻辑的实体。


答案 1

用。它在实体上返回未初始化的代理,而不转到数据库。您的用例是此方法存在的主要原因。em.getReference(Account.class, accountId)


答案 2

除了 spring-data-jpa 之外,还有其他解决方案:em.getReferenceJpaRepository.getOne

  1. 可以通过更新查询。例如,使用弹簧数据

    @Transactional
    @Modifying
    @Query("UPDATE Preference SET prop1=:prop1 .. WHERE u.id=:id")
    int updatePreference(@Param("id") int id, @Param("prop1") String prop1, ...);
    

请参阅在 Spring Data JPA 中使用更新查询更新实体

  1. 有一些 spring 数据是从请求参数或路径变量自动解析实体实例的。例如:DomainClassConverter

    @GetMapping("/employees/{id}")
    public Employee getEmployeeById(@PathVariable("id") Employee employee) {
        return employee;
    } 
    

请参阅从请求参数或路径变量解析实体实例


推荐