我读了许多关于级联和多对多关联的主题,但我还没有找到我的问题的答案。
我有一个用户配置文件(UserProfiles)和角色(Roles)之间的多对多关系。当我删除一个用户配置文件时,我希望数据库删除join表(userprofile2role)中的相关记录,进行实际的SQL“ON DELETE CASCADE”操作。这是否可行?无论我尝试什么,Hibernate总是在不指定ON DELETE行为的情况下创建用户配置文件(UserProfile)表。
用户配置文件(UserProfile)映射如下:
我有一个用户配置文件(UserProfiles)和角色(Roles)之间的多对多关系。当我删除一个用户配置文件时,我希望数据库删除join表(userprofile2role)中的相关记录,进行实际的SQL“ON DELETE CASCADE”操作。这是否可行?无论我尝试什么,Hibernate总是在不指定ON DELETE行为的情况下创建用户配置文件(UserProfile)表。
用户配置文件(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;
}
}
很遗憾,这些映射所生成的连接表的SQL不包含ON CASCADE DELETE部分。我尝试在UserProfile中的roles集合和Role中的userprofiles集合上设置CascadeType.REMOVE行为(如下所示),但没有效果。欢迎您提出建议 :-)
CREATE TABLE `px_userprofile2role` (
`userprofile_id` BIGINT(20) NOT NULL,
`role_id` BIGINT(20) NOT NULL,
PRIMARY KEY (`userprofile_id`,`role_id`),
KEY `FK1C82E84191F65C2B` (`userprofile_id`),
KEY `FK1C82E8416203D3C9` (`role_id`),
CONSTRAINT `FK1C82E8416203D3C9` FOREIGN KEY (`role_id`) REFERENCES `px_role` (`id`),
CONSTRAINT `FK1C82E84191F65C2B` FOREIGN KEY (`userprofile_id`) REFERENCES `px_userprofile` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=latin1