JPA如何使用现有实体的id保存一个带有引用的“新”实体?

12
说你有一辆车,上面有一组轮胎。

Say you have a Car with a collection of Tires.


@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。


1
不行。JPA 的整个目的就是表示和处理关系,因此您不能通过使用了解关系实际上如何在您的数据库层中实现的知识来进行黑客攻击。 - Zielu
您可以使用实体图来获取部分填充的对象。 - Zielu
你使用的是哪个版本的JPA?我在这里测试了JPA 2.1,它没有加载所有集合,只是为了向列表中添加一个项目。 - uaiHebert
1个回答

14
您可以使用 id 来加载代理“委托”对象,通过 EntityManager.getReference。它在您访问对象的任何属性之前不会发出任何数据库查询。
如果访问属性,将启动懒加载机制并加载实际对象。 以下问题 演示了代理对象的解剖结构,有助于更好地理解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接