JPA:映射为 @ManyToMany @JoinTable 的关系的隐式级联?

问题描述 投票:0回答:2

我有以下映射:

@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);

在上述实体上确实保持关联的伙伴关系,而不指定任何级联类型。

我是否正确地认为这个隐式级联必须执行?我看的任何地方都没有提到这一点...

java jpa many-to-many eclipselink cascade
2个回答
15
投票
连接表中的行将作为所属实体的一部分被插入/删除(如果是双向的,则没有mappedBy的一侧)。因此,如果您坚持或删除或更新

Prequalification

,连接表行也将被插入或删除。

目标

Company

对象不会被级联到。所以在remove()上它们不会被删除,如果列表被更新它们也不会被删除,除非设置了orphanRemovla。持久化也不应该级联,但是当您引用“分离”对象时会发生什么,这在某种程度上是一个灰色区域。从技术上讲,应该抛出错误,因为对象是新的,并且关系不是级联持久的。它还可能尝试插入并获取约束错误。它不应该级联持久化,尽管您的对象模型在技术上处于无效状态,因此发生的情况可能取决于提供者。


0
投票
想添加评论,但没有足够的代表。

我和@D-Dᴙum有同样的问题:“

在文档中我们可以在哪里找到对此行为的引用?

我在

Hibernate 文档(多对多)中找到了它。 如果您在代码示例下方滚动一点,您会发现:

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

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

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.