以下是导致问题的序列:
我很困惑:
请赐教:)
谢谢!
答案 0 :(得分:10)
JPA规范说:
合并操作的语义 应用于实体X如下:
如果X是分离的实体,则为状态 将X复制到预先存在的 管理实体实例X'相同 X的身份或新的托管副本X' 已创建。
如果X是新实体 例如,一个新的管理实体 实例X'创建和状态 将X复制到新的托管中 实体实例X'。
如果X是a 删除实体实例,
IllegalArgumentException
将是。{ 由合并操作抛出(或者 事务提交将失败)。如果是X. 是一个托管实体,它被忽略 然而,合并操作 合并操作级联到 关系引用的实体 来自X,如果这些关系有 已经注册了级联 元素值
cascade=MERGE
或cascade=ALL
注释。对所有人来说 关系引用的实体Y. 来自X的具有级联元素 值
cascade=MERGE
或cascade=ALL
,Y 以Y'递归合并。对全部 这样的Y由X引用,X'设置为 参考Y'。 (注意,如果X是 管理然后X是与之相同的对象 X”)如果X是合并到X'的实体, 引用另一个实体Y,
cascade=MERGE
或cascade=ALL
的位置 未指定,然后导航 来自X'的相同关联产生a 引用托管对象Y' 与Y相同的持久性身份。
正如你所看到的,这里没有魔力。已分离实例的状态将复制到新创建的托管实例中。由于您的分离实例有一个空列表,托管实例也会有它。
进一步的行为取决于关系的所有权,因为数据库中的表示反映了关系的拥有方:
Team
是拥有方,则Team
和Player
之间的关系将在刷新期间被销毁(但Player
本身将存在,除非您拥有orphanRemoval = true
关于你的关系)。Team
中使用空列表不会影响数据库。如果在刷新上下文之前刷新Team
,则Team
的所有属性都会被数据库中的值重写,因此Player
的列表将被恢复(因为空列表中的flush()
球员还没有脸红。)
如果在调用refresh()
之前致电Team
,而flush()
是拥有方,则列表将为空,因为在{{1}}期间,关系的破坏会传播到数据库