我正在试图弄清楚EclipseLink如何确定需要在合并中插入集合的哪些元素。
例如,此实体:
@Entity(name = "subject")
@Table(name = "subject")
public final class Subject {
...
@ElementCollection(fetch = FetchType.EAGER)
private List<String> permissions = new ArrayList<String>();
以及Subject
public Subject update(Subject entity) {
EntityManager entityManager = provider.get();
entityManager.getTransaction().begin();
entityManager.merge(entity);
entityManager.getTransaction().commit();
return entity;
}
...当我尝试更新它时,我可以从postgresqls日志中看到这种行为:
-- first, selecting the object I want
2013-12-10 03:48:19 GMT LOG: execute <unnamed>: SELECT id FROM subject WHERE (id = $1)
2013-12-10 03:48:19 GMT DETAIL: parameters: $1 = '567'
2013-12-10 03:48:19 GMT LOG: execute <unnamed>: SELECT t0.PERMISSIONS FROM subject_PERMISSIONS t0 WHERE (t0.subject_id = $1)
2013-12-10 03:48:19 GMT DETAIL: parameters: $1 = '567'
-- after calling merge, adding the new permission
2013-12-10 03:50:01 GMT LOG: execute S_1: BEGIN
2013-12-10 03:50:01 GMT LOG: execute <unnamed>: INSERT INTO subject_PERMISSIONS (subject_id, PERMISSIONS) VALUES ($1, $2)
2013-12-10 03:50:01 GMT DETAIL: parameters: $1 = '567', $2 = 'new:perm'
2013-12-10 03:50:01 GMT LOG: execute S_2: COMMIT
当我第一次使用subject
拉取对象时,permissions
和EntityManager
的选择就出现了,我得到了一个Subject
个对象。这很好,但我不明白的是,当我然后将"new:perm"
添加到该集合并使用merge
方法时,EclipseLink以某种方式想出只需要插入新的perm而不需要其他信息。
Subject
对象似乎不是代理中包含任何额外信息,而且EclipseLink没有进行任何额外的数据库查询工作来找出数据库中已存在的权限,因此EclipseLink如何确定只需要插入我刚刚添加的权限吗?
答案 0 :(得分:2)