如果要将新实例添加到两个已经存在的实体之间的关系(在这种情况下是一对多),那么您必须首先从数据库中获取包含集合的实体;在你的情况下myEntity
。
因此,当您加载该实体时,您会将其带入内存。如果您已将这两者之间的关系定义为,EAGER
那么所有相关实体(集合中的实体)也将与父实体同时被获取。如果您将关系定义为,LAZY
则在您访问集合时(换句话说,当您getXXX
为该集合调用 getter 方法时)将加载相关实体。
之所以会这样,是因为 JPA 实现(现在我正在考虑 Hibernate)返回实体的代理而不是实际实例,因此它们可以拦截 getter/setter 方法调用并对实体的状态执行任何跟踪。
对,所以现在你想向关系中添加更多实例。EAGER
关系是或在这种情况下并不重要,LAZY
因为您最终将调用集合的 getter 方法以便能够对其执行add(myNewEntity);
。因此,已经存在的实体在集合中,您只是在集合实现语义下添加(可能)未跟踪的实体。
当持久myEntity
化回数据库时,JPA 实现将知道实际集合的哪些实例需要一个update
、一个delete
或一个insert
。如果您刚刚添加了新实例,那么只会insert
发出语句,但您也可以从集合中删除实体或更改已存在实例的状态(调用 setter)。JPA 实现能够识别这些操作并发出适当的 SQL 语句以使数据库保持最新。