Jul*_*ius 4 many-to-many hibernate cascade jpa-2.0 sql-delete
我已经阅读了很多关于级联和多对多关联的主题,但我无法找到我的特定问题的答案.
我在UserProfiles和Roles之间有多对多的关系.当我删除UserProfile时,我希望数据库删除连接表(userprofile2role)中的关联记录,因此使用实际的SQL"ON DELETE CASCADE"操作.这可能吗?无论我尝试什么,Hibernate总是创建UserProfile表而不指定ON DELETE行为.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
角色映射:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这些映射产生的连接表的SQL不包含ON CASCADE DELETE部分.我尝试在UserProfile中的角色集合和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
Run Code Online (Sandbox Code Playgroud)
ON DELETE CASCDADE
在JPA中不支持生成DDL.级联REMOVE操作的概念不是DDL级别构造.级联是关于级联生命周期操作,其目标是实体到相关实体.它们与数据库中的级联无关.在JPA 2.0规范中,这解释如下:
如果X是新实体,则remove操作会忽略它.但是,如果从X到这些其他实体的关系使用cascade = REMOVE或cascade = ALL annotation元素值进行注释,则删除操作会级联到X引用的实体.
如果X是托管实体,则删除操作会导致其被删除.如果从X到这些其他实体的关系使用cascade = REMOVE或cascade = ALL注释元素值进行注释,则删除操作将级联到由X引用的实体.
此外,REMOVE不应与@ManyToMany一起使用(来自JPA 2.0规范):
关系建模注释约束了cascade = REMOVE规范的使用.cascade = REMOVE规范应仅应用于指定为OneToOne或OneToMany的关联.将cascade = REMOVE应用于其他关联的应用程序不可移植.
在生成ON DELETE CASCDADE
DDL方面,Hibernate中有供应商扩展@OnDelete:
@OnDelete(action=OnDeleteAction.CASCADE)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7670 次 |
最近记录: |