java - 使用 @ElementCollection 对实体进行级联删除

标签 java jpa hibernate-cascade

级联删除我的父实体时遇到问题:

org.postgresql.util.PSQLException:表“child”上的更新或删除违反了约束“XXX”:对于键(id)=(4),表“child_properties”中有引用

@Entity
@Table(name = "Parent")
public class Parent{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.EAGER,mappedBy = "parent")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Set<Child> children;
}

@Entity
@Table(name = "child")
public class Child{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @ElementCollection(fetch = FetchType.EAGER)
    private Map<String,String> properties;
}

我希望子级删除其在parentRepository.delete(parent)上的属性 但这只发生在 childRepository.delete(child) 上。父级删除抛出异常

最佳答案

解决方案大约花了 3 个小时谷歌搜索...... 这个想法是设置自定义外键

@ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "child_properties"
        ,joinColumns = {
            @JoinColumn(name = "child_id"
                , referencedColumnName = "id"
                ,foreignKey=@ForeignKey(name="CHILD_PROPERTY_FK"
                    , foreignKeyDefinition = "FOREIGN KEY (child_id) references public.child (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE"))
        }
    )
    @MapKeyColumn(name = "name")
    @Column(name = "value")
    private Map<String,String> properties;

关于java - 使用 @ElementCollection 对实体进行级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431753/

相关文章:

java - hibernate -级联类型持续存在多对多关系

java - Hibernate OnDelete Cascade 不适用于 MySql 但适用于 postgres 和 Ms-Sql

java - 在groovy中创建 map

java - Eclipse CDT : How to write to . cproject 文件并读回

JavaFX:如何将 TilePane 居中,但从左到右放置 TilePane 子级?

java - Hibernate Annotations - 哪个更好,字段访问还是属性访问?

java - Hibernate Cascade 来自另一个数据库的另一个 ID

java - 使用 Java 检索 python 脚本的输出

java - Hibernate - 多个多对多关联 - 无法同时获取多个包

java - 客户端-服务器应用程序的 JPA 悲观锁逻辑