0

我们有两个实体 Entity1 和 Entity2,其中 Entity1 包含一组 Entity2,我们已经有数千个实体存储在实体类型 Entity2 的数据库中,这些实体都从 Entity1 的实例引用,比如 myEntity。

现在,如果我将更多 Entity2 实体添加到集合中并尝试持久化 myEntity,其中新添加的 Entity2 实体已经持久化。

我的问题是 myEntity 的持久化行为如何,关系的现有成员是否会移动到内存中,是否会添加新成员或将新成员添加到数据库而不将现有成员带入内存

4

2 回答 2

0

如果您有数千个引用的实体,最好不要映射关系,而只在需要时查询它 - 允许您使用分页或其他机制来减少一次读取的实体数量。这取决于它是什么类型的映射,但只需要映射拥有关系(没有映射的关系)来设置数据库中的外键。如果还没有,请将 Entity2 端设置为拥有端。

如果这是一个带有关系表的 M:M 并且从 Entity2 端映射没有意义 - 您可以为关系表添加一个实体,您将以相同的方式读取该实体。新实体将具有对 Entity1 的引用,但 Entity1 不会引用它,并且当应用需要获取与特定 Entity1 关联的 Entity2 时,应用程序将查询新实体。

于 2013-07-31T14:12:00.023 回答
0

如果要将新实例添加到两个已经存在的实体之间的关系(在这种情况下是一对多),那么您必须首先从数据库中获取包含集合的实体;在你的情况下myEntity

因此,当您加载该实体时,您会将其带入内存。如果您已将这两者之间的关系定义为,EAGER那么所有相关实体(集合中的实体)也将与父实体同时被获取。如果您将关系定义为,LAZY则在您访问集合时(换句话说,当您getXXX为该集合调用 getter 方法时)将加载相关实体。

之所以会这样,是因为 JPA 实现(现在我正在考虑 Hibernate)返回实体的代理而不是实际实例,因此它们可以拦截 getter/setter 方法调用并对实体的状态执行任何跟踪。

对,所以现在你想向关系中添加更多实例。EAGER关系是或在这种情况下并不重要,LAZY因为您最终将调用集合的 getter 方法以便能够对其执行add(myNewEntity);。因此,已经存在的实体在集合中,您只是在集合实现语义下添加(可能)未跟踪的实体。

当持久myEntity化回数据库时,JPA 实现将知道实际集合的哪些实例需要一个update、一个delete或一个insert。如果您刚刚添加了新实例,那么只会insert发出语句,但您也可以从集合中删除实体或更改已存在实例的状态(调用 setter)。JPA 实现能够识别这些操作并发出适当的 SQL 语句以使数据库保持最新。

于 2013-07-31T12:59:54.970 回答