如何使用外键保存实体而不在 JPA 中加载相关实体?

Posted

技术标签:

【中文标题】如何使用外键保存实体而不在 JPA 中加载相关实体?【英文标题】:How do I save an entity with foreign key without loading the related entity in JPA? 【发布时间】:2012-10-10 21:45:46 【问题描述】:

我有两个实体:

Account 
  @Id
  Long id;


Preference 
  ...
  @ManyToOne
  private Account account;

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

见Updating Entities with Update Query in Spring Data JPA

    spring-data DomainClassConverter 可以从请求参数或路径变量中自动解析实体实例。例如

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

见Resolving entity instances from request parameters or path variables

【讨论】:

以上是关于如何使用外键保存实体而不在 JPA 中加载相关实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何让jpa休眠创建具有多对一但没有外键的实体

如何避免使用 JPA 在实体关系中违反外键约束

JPA 实体中的预/后加载更新

JPA的一对多,多对多用法

从 JPA/Hibernate 中的视图加载实体

如何在 JPA JPQL 查询中加入两个实体集合?