我有两个实体父母和孩子有单向关系

class Parent {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
}


class Child {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "parent_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Parent parent;
}

在我配置的application.properties文件中
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database-platform = org.hibernate.dialect.MySQL5InnoDBDialect

但是当我运行应用程序时,会创建以下语句
...
alter table child add constraint FKi62eg01ijyk2kya7eil2gafmx foreign key (parent_id) references parent (id)
...

所以没有应该有的级联删除。每次运行应用程序时都会创建表,并检查方法
org.hibernate.dialect.MySQL5InnoDBDialect#supportsCascadeDelete()

是真的。我使用的是SpringBootParentversion1.4.3,它使用Hibernate5.11。有什么想法吗?顺便说一句,我不想用双向关系。
编辑
多亏了@AlanHay,我发现我遗漏了一个重要的部分。实际上还有第三类
class Kindergarten {

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

    @OneToMany(mappedBy = "kindergarten", fetch = FetchType.EAGER)
    @MapKeyJoinColumn(name = "parent_id") // parent_id causes the problem!
    private Map<Parent, Child> children;
}

有幼儿园的孩子看起来真的是这样
class Child {

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

    @ManyToOne(optional = false)
    @JoinColumn(name = "parent_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Parent parent;

    @ManyToOne
    @JoinColumn(name = "kindergarten_id")
    private Kindergarten kindergarten;
}

这就是问题发生的原因。如果将Makey键列注释中的“PaltSyID”更改为列中不存在的“列”,例如“MaMyID”,则将“删除”级联添加到子项中的外键PrutsIdID。如果参数是子列“parent_id”,则不会追加ON DELETE CASCADE部分。不幸的是,原因我还不清楚。更改参数不是选项,因为我想使用子对象的父对象的现有链接。

最佳答案

可能有点晚了,但因为它是搜索“hibernate ondelete generate cascade”时的最重要的帖子之一:
出于某种原因,在Mysql中将@OnDelete放在ManyToOne端对我不起作用,但在OneToMany端起作用所以,如果你不走运,试试另一边。

10-08 16:08