18

我有两个实体:

Account {
  @Id
  Long id;
}

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

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

加载 Account 实体并将其设置为首选项?对我来说,这似乎是一次错误的数据库之旅。

有一个可持久的 accountId 字段并使 Account 字段为只读?同时拥有 accountId 字段和 Account 字段似乎是多余的?

使用 NamedQuery 来持久化 Preference?我希望只是一般地保存一个没有特殊逻辑的实体。

4

2 回答 2

15

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

于 2012-10-10T21:48:42.850 回答
2

除了em.getReferenceJpaRepository.getOne操纵 spring-data-jpa 还有其他解决方案:

  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-dataDomainClassConverter可以从请求参数或路径变量中自动解析实体实例。例如

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

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

于 2018-09-17T19:12:07.540 回答