Hibernate 关于JPA2多对多关系的级联删除

Hibernate 关于JPA2多对多关系的级联删除,hibernate,many-to-many,jpa-2.0,cascade,sql-delete,Hibernate,Many To Many,Jpa 2.0,Cascade,Sql Delete,我已经阅读了很多关于级联和多对多关联的主题,但是我还没有找到我的特定问题的答案 我在用户配置文件和角色之间存在多对多关系。当我删除一个UserProfile时,我希望连接表(userprofile2role)中的相关记录被数据库删除,因此使用实际的SQL“ON DELETE CASCADE”操作。这可能吗?无论我尝试什么,Hibernate总是创建UserProfile表,而不指定ON DELETE行为 用户配置文件映射: @Entity public class UserProfile {

我已经阅读了很多关于级联和多对多关联的主题,但是我还没有找到我的特定问题的答案

我在用户配置文件和角色之间存在多对多关系。当我删除一个UserProfile时,我希望连接表(userprofile2role)中的相关记录被数据库删除,因此使用实际的SQL“ON DELETE CASCADE”操作。这可能吗?无论我尝试什么,Hibernate总是创建UserProfile表,而不指定ON DELETE行为

用户配置文件映射:

@Entity
public class UserProfile {

    private Long id;
    private Set<Role> roles;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public final Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    // Note: CascadeType.ALL doesn't work for many-to-many relationships
    @ManyToMany (fetch = FetchType.EAGER)
    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}
@Entity
public class Role {

    private Long id;
    private Set<UserProfile> userProfiles = new HashSet<UserProfile>();

    @Id
    @GeneratedValue
    public final Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    // CascadeType.REMOVE doesn't create ON CASCADE DELETE in SQL?
    @ManyToMany(mappedBy = "roles", cascade = CascadeType.REMOVE)
    public Set<UserProfile> getUserProfiles() {
        return userProfiles;
    }

    public void setUserProfiles(Set<UserProfile> userProfiles) {
        this.userProfiles = userProfiles;
    }
}

在JPA中,不支持在DELETE CASCDADE到DDL时生成
。级联删除操作的概念不是DDL级别的构造。级联是将以实体为目标的生命周期操作级联到相关实体。它们与数据库中的级联无关。在JPA 2.0规范中,这一点解释如下:

如果X是新实体,则删除操作将忽略它。然而, 如果 从X到这些其他实体的关系用 级联=删除或级联=所有注释元素值

如果X是托管实体,则删除操作会使其成为 远离的。移除操作级联到X引用的实体, 如果从X到这些其他实体的关系用 cascade=REMOVE或cascade=ALL注释元素值

此外,REMOVE不应与@ManyToMany一起使用(来自JPA 2.0规范):

关系建模注释限制了 级联=删除规范。cascade=REMOVE规范应该 仅适用于指定为OneToOne或OneToOne的关联 一个女人。应用级联=删除到其他应用程序的应用程序 关联是不可移植的

在DELETE CASCDADE
上生成DDL时,Hibernate中有供应商扩展:

@OnDelete(action=OnDeleteAction.CASCADE)

我在多对多关系中使用@OnDelete时出错,但我不想将我的应用程序绑定到Hibernate。我将创建一个不同的解决方案,并在应用程序级别删除记录。谢谢你的解释。
@OnDelete(action=OnDeleteAction.CASCADE)