如何使用外键保存实体而不在 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.getReference
或 JpaRepository.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 中加载相关实体?的主要内容,如果未能解决你的问题,请参考以下文章