我的模型看起来像这样:
A -- Many-toMany --> B -- Many-toMany --> C
A
和B
的CascadeType均为All
,FetchType为Lazy
。
当我拨打以下电话时:
A mergedA = (A) session.merge(a);
mergedA
已解析B
个对象的集合。但是B
没有解析其C
个对象的集合。
如果我拨打以下电话:
B mergedB = (B) session.merge(b);
mergedB
已解析C
个对象的集合。
如果A
和B
的CascadeType都为All
,为什么C
对象的集合无法解析为B
s的集合当我打电话给session.merge(a);
时?
答案 0 :(得分:1)
我认为它是因为级联与传递持久性有关,而与懒惰与非懒惰无关。
传递持久性作为一个概念适用于您希望从父母“转移”到子女的逻辑操作。所以关于“你删除了一个父母,是否应该级联到孩子们?” - 它关于你在对象关系中想要的语义。
lazy vs non lazy是一个持久性实现细节。所以关于“我作为持久层现在加载这个东西吗?” - 关于如何优化持久层。
作为一个注释,我想知道这是否是一个正确的合并应用程序。合并是用于在会话中已经具有相同id的对象时将分离的对象重新附加到会话。我有点惊讶它正在装载孩子们。
答案 1 :(得分:1)
因为,它是在对象图中的单步深处完成的,C
是第二步。因此,它只针对眼前的那个。