【问题标题】:JPA save "new" Entity with reference to an existing Entity using only it's id?JPA 仅使用其 id 参考现有实体保存“新”实体?
【发布时间】:2015-05-23 01:33:45
【问题描述】:

假设您有一辆带有一系列轮胎的汽车。

@Entity
public class Car {
    private Long id;
    @OneToMany(mappedBy = "car")
    private Set<Tire> tires = new HashSet<>();
}

@Entity
public class Tire {
    private Long id;
    ...
}

现在,如果您想添加一辆新汽车并添加现有的轮胎,您可以获取整个现有的轮胎实体来填充汽车的集合。

是否可以简单地拥有一些轮胎 ID 并保存汽车而不首先将整个轮胎实体提取到内存中?如果它只是一个单一的轮胎实例而不是一个集合,有没有办法只用一个轮胎 ID 来保存它?使用 JPA 和 Criteria API,或者可能是 JPQL。

【问题讨论】:

  • 不。 JPA 的全部意义在于表示和处理关系,因此您不能通过使用关系如何在您的数据库层中实际实现的知识来破解。
  • 您可以使用实体图来获取部分填充的对象。
  • 您使用的是什么版本的 JPA?我在这里使用 JPA 2.1 进行了测试,它并没有加载所有集合只是为了将一个项目添加到列表中。

标签: java hibernate jpa


【解决方案1】:

您可以使用 id 通过EntityManager.getReference 加载代理“代理”对象。除非您访问对象的任何属性,否则它不会发出任何数据库查询。

如果您确实访问了一个属性,延迟加载机制将启动并加载一个实际对象。 following question 演示了代理对象的解剖结构。有助于获得更好的图片

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 2021-07-09
    • 1970-01-01
    • 2013-04-03
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多