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