如果删除不管理该关联的实体,是否可以让Hibernate处理@ManyToMany关联中的条目删除?

时间:2018-12-06 01:51:31

标签: java spring hibernate jpa spring-data-jpa

如果我删除了一个不管理该关联的实体,是否可以让Hibernate处理@ManyToMany关联的JoinTable中的条目的删除?

据我了解,如果我有这样的@ManyToMany关联:

@Entity
public class AlertConfigurationVersion {

    @JoinTable(
                name = SUBJECT_ALERTCONFIGURATION_VERSION_TABLE,
                joinColumns = @JoinColumn(name = "alert_configuration_version_id"),
                inverseJoinColumns = @JoinColumn(name = "subject_id")
    @ManyToMany(cascade = {
                CascadeType.DETACH,
                CascadeType.MERGE,
                CascadeType.REFRESH,
                CascadeType.PERSIST})
    private Set<Subject> subjects = new HashSet<>();
}

然后,如果我删除了AlertConfigurationVersion,@ ManyToMany表将针对指向该表的任何Subject进行正确更新。

但是,在我的情况下,我正在使用标准存储库方法删除Subject,现在我得到了一个带有基础

的讨厌的org.hibernate.exception.ConstraintViolationException
org.postgresql.util.PSQLException: ERROR: update or delete on table "subject" violates foreign key constraint "fks123x93urj80014yg4vem4h43" on table "subject_alertconfigurationversion"
  Detail: Key (id)=(9b915613-f37d-45c2-8fd8-8da4f9291aea) is still referenced from table "subject_alertconfigurationversion".

我可以让Hibernate以某种方式处理此案吗?理想情况下,不要通过使该关联为双向来进行关联,因为这不需要业务逻辑。我认为这没关系。

我正在使用Lombok生成哈希码和等号,但我也尝试根据https://dev.to/alagrede/why-i-dont-want-use-jpa-anymore-flhttps://developer.jboss.org/wiki/EqualsAndHashCode?_sscc=t的建议从这些参考中排除引用和/或ID

相关:ManyToMany with cascade all only cascading one way,尽管这是5年前的事,并没有引起太多关注,但现在甚至到那时都可能会有某种方式。

另一个相关的问题:Hibernate many-to-many cascading delete,我通过复制可折叠物体来尝试了最高答案中的“ hack”,但这引起了所有其他类型的问题,Vlad Mihalcae特别指出(在其他地方)不要这样做。 / p>

https://hibernate.atlassian.net/browse/HHH-12239处的Hibernate上还有一个未解决的问题,看起来像我的问题,因此似乎已将其识别为错误,但我不确定100%适用于我的情况。问题是双向关联。

1 个答案:

答案 0 :(得分:1)

SUBJECT_ALERTCONFIGURATION_VERSION_TABLE实体不知道此关联的情况下,Hibernate如何从Subject删除关联的行?

解决此问题的唯一方法是使用基于FK的CASCADE ON DELETE:

ALTER TABLE SUBJECT_ALERTCONFIGURATION_VERSION_TABLE
ADD CONSTRAINT fk_alert_configuration_version_subject_id
FOREIGN KEY (subject_id) REFERENCES subject 
ON DELETE CASCADE