JPA: @ManyToMany @JoinTable映射关系的隐式级联作用是什么?

8

我有以下映射:

@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)自动持久化、删除等操作似乎是隐含的,即使默认情况下,关系没有设置级联操作。
以上引用摘自Mike Keith的《Pro JPA 2》。
执行:
em.merge(prequalification);

在上述实体上,如果没有指定任何级联类型,则会保留关联的合作伙伴关系。
我是否正确理解了必须执行这种隐式级联?我查看的任何地方都没有提到这一点...

我假设你在某个时候已经熟悉了Hibernate,并且你可以参考Hibernate和Hibernate注解文档来回答你的问题。它们有非常详细的章节关于关系定义和级联操作。 - Jerry Tian
2个回答

15

加入表中的行将作为拥有实体的一部分进行插入/删除(如果是双向的,则为没有设置mappedBy的那一侧)。因此,如果您持续或删除或更新预资格,则加入表中的行也将被插入或删除。

目标公司对象将不会被级联到。因此,在remove()上,它们不会被删除,如果列表被更新,除非设置了orphanRemoval,否则它们将不会被删除。 Persist 也不应该被级联,但是当您引用“分离”的对象时会发生什么是一个灰色区域。从技术上讲,应该抛出错误,因为对象是新的且关系没有级联保留。它也可能尝试插入并获得约束错误。它不应该级联persist,尽管您的对象模型从技术上处于无效状态,因此发生的情况可能取决于提供者。


1
@James 我不清楚在JPA规范中(除非您指的是Hibernate规范),它明确或暗示地说明“连接表中的行将作为拥有实体的一部分插入”。例如,JPA规范11.1.30说明:“级联元素指定传播到关联实体的可级联操作集。” 它没有提及在缺少级联元素的情况下连接记录会发生什么。您有其他参考资料吗? - D-Dᴙum

0

想要添加评论,但是没有足够的声望。

我和 @D-Dᴙum 有同样的问题:“在文档中我们可以找到这种行为的参考吗?

我在 Hibernate 文档(多对多) 中找到了答案。
如果你向下滚动一点,在代码示例下面,你会发现:

当一个实体从 @ManyToMany 集合中移除时,Hibernate 只是删除链接表中的连接记录。不幸的是,这个操作需要删除与给定父项相关联的所有条目,并重新创建在当前运行的持久上下文中列出的条目。

其中“链接表”指的是“连接表”。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接