EclipseLink如何合并集合?

时间:2013-12-10 04:14:39

标签: jpa eclipselink

我正在试图弄清楚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拉取对象时,permissionsEntityManager的选择就出现了,我得到了一个Subject个对象。这很好,但我不明白的是,当我然后将"new:perm"添加到该集合并使用merge方法时,EclipseLink以某种方式想出只需要插入新的perm而不需要其他信息。

Subject对象似乎不是代理中包含任何额外信息,而且EclipseLink没有进行任何额外的数据库查询工作来找出数据库中已存在的权限,因此EclipseLink如何确定只需要插入我刚刚添加的权限吗?

1 个答案:

答案 0 :(得分:2)

Caching.

默认情况下,没有意识到EclipseLink具有超出事务的缓存行为。

在没有该对象通过JPA的情况下运行测试会显示正在运行的预期选择以确定需要更新/插入的内容。