Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa EclipseLink如何合并一个集合?_Jpa_Eclipselink - Fatal编程技术网

Jpa EclipseLink如何合并一个集合?

Jpa EclipseLink如何合并一个集合?,jpa,eclipselink,Jpa,Eclipselink,我试图弄清楚EclipseLink是如何确定集合的哪些元素需要作为合并的一部分插入的 例如,该实体: @Entity(name = "subject") @Table(name = "subject") public final class Subject { ... @ElementCollection(fetch = FetchType.EAGER) private List<String> permissions = new ArrayList<S

我试图弄清楚EclipseLink是如何确定集合的哪些元素需要作为合并的一部分插入的

例如,该实体:

@Entity(name = "subject")
@Table(name = "subject")
public final class Subject {
    ...
    @ElementCollection(fetch = FetchType.EAGER)
    private List<String> permissions = new ArrayList<String>();
…我可以在尝试更新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
当我第一次使用EntityManager拉取对象并取回一个subject对象时,会发生选择subject和permissions。这很好,但我不明白的是,当我将new:perm添加到该集合并使用merge方法时,EclipseLink不知怎的发现,只需要插入新的perm,而不需要其他信息

Subject对象似乎不是包含任何额外信息的代理,EclipseLink也没有做任何额外的数据库查询工作来找出数据库中已经存在哪些权限,那么EclipseLink是如何确定只需要插入我刚刚添加的权限的呢

没有意识到EclipseLink在默认情况下具有事务之外的缓存行为


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

再次感谢您的洞察力,我昨天也问了自己同样的问题。
-- 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