我有以下映射:
@Entity
@Table(name = "Prequalifications")
public class Prequalification implements Serializable
{
...
@ManyToMany
@JoinTable(name = "Partnerships", joinColumns = @JoinColumn(name = "prequalification_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "company_id", referencedColumnName = "id"))
private Set<Company> companies;
...
}
在
@ManyToMany
+ @JoinTable
映射关系中,关联(链接)实体(此处为 Partnerships
)会自动持久化、删除等,这不是隐含的吗?即使
默认情况下,关系有一个空的级联集
?以上引用摘自“Pro JPA 2,作者:Mike Keith”。
执行中
em.merge(prequalification);
在上述实体上确实保持关联的伙伴关系,而不指定任何级联类型。
我是否正确地认为这个隐式级联必须执行?我看的任何地方都没有提到这一点...
Prequalification
,连接表行也将被插入或删除。目标
Company
对象不会被级联到。所以在remove()上它们不会被删除,如果列表被更新它们也不会被删除,除非设置了orphanRemovla。持久化也不应该级联,但是当您引用“分离”对象时会发生什么,这在某种程度上是一个灰色区域。从技术上讲,应该抛出错误,因为对象是新的,并且关系不是级联持久的。它还可能尝试插入并获取约束错误。它不应该级联持久化,尽管您的对象模型在技术上处于无效状态,因此发生的情况可能取决于提供者。
我和@D-Dᴙum有同样的问题:“
在文档中我们可以在哪里找到对此行为的引用?”
我在Hibernate 文档(多对多)中找到了它。
如果您在代码示例下方滚动一点,您会发现:
当从@ManyToMany集合中删除一个实体时,Hibernate只是删除链接表中的连接记录。不幸的是,此操作需要删除与给定父级关联的所有条目,并重新创建当前运行的持久上下文中列出的条目。其中“链接表”指的是“连接表”。
希望这有帮助。