角色role和权限perm是多对多关系,在中间表t_role_perm中有一个角色对应多个权限,我现在想取消几个权限,一般的数据库方式就是 delete from t_role_perm where role_id=? and perm_id=?就可以了,但是hibernate怎么才能达到这样的效果?
这得看你是怎么写hibernate的pojo了,如果是像一楼那样子把中间表也生成出来那么一楼那样子直接getSession().delete(RoleFunctionEntity)删除中间表中的数据就行了;如果你用hibernate反向工程生成pojo并且选择了enable many to many detect,那么不生成中间表的类, 那么你得先看看是哪一方在维护中间表,只要看mappedby加在哪一方那么那一方就不维护中间表,假如你这里role是维护中间表的,那么你先session.get(role.class,id)这样子拿出你这个角色对象role,然后你role.getPerms拿出这个权限的角色set集合,然后想去掉哪个权限就删除这个集合里相应的权限类就ok了,最后直接session.update(role)就行了 我说的是注解配置的hibernate你要是xml配置的我们再讨论
[code="java"]
不需要这样删除吧, 可以删除对象的方式吧
roleEntity.getUserGroups().clear();
session.delete(roleEntity);
[/code]
我之前也做过类似的,我们是role、function、及中间表rolefunction
[code="java"]
@Entity
@Table(name="roletbl")
public class Role implements Serializable{
private static final long serialVersionUID = -4758237150336472776L;
@Id
@Column(name = "iRoleId", nullable = false)
private Integer iRoleId;
@Column(name = "sRoleName", nullable = false, unique = true, length = 32)
private String sRoleName;
@Column(name = "sRoleDetails", nullable = true, length = 128)
private String sRoleDetails;
@Column(name = "iRoleMode", nullable = false)
private Integer iRoleMode;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "iRoleId")
private List<RoleFunction> rftb = new ArrayList<RoleFunction>();
public List<RoleFunction> getRftb() {
return rftb;
}
public void setRftb(List<RoleFunction> rftb) {
for (int i = 0; i < rftb.size(); i++) {
rftb.get(i).setiRoleId(iRoleId);
}
this.rftb = rftb;
}
public Integer getiRoleId() {
return iRoleId;
}
public void setiRoleId(Integer iRoleId) {
this.iRoleId = iRoleId;
}
public String getsRoleName() {
return sRoleName;
}
public void setsRoleName(String sRoleName) {
this.sRoleName = sRoleName;
}
public String getsRoleDetails() {
return sRoleDetails;
}
public void setsRoleDetails(String sRoleDetails) {
this.sRoleDetails = sRoleDetails;
}
public Integer getiRoleMode() {
return iRoleMode;
}
public void setiRoleMode(Integer iRoleMode) {
this.iRoleMode = iRoleMode;
}
}
[/code]
[code="java"]
@Entity
@Table(name="functiontbl")
public class Function implements Serializable{
private static final long serialVersionUID = -1207218576602710544L;
@Id
@Column(name = "iFunctionId", nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer iFunctionId;
@Column(name = "sFunctionName", nullable = false, unique = true, length = 32)
private String sFunctionName;
@Column(name = "sFunctionDetails", nullable = true, length = 128)
private String sFunctionDetails;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "iFunctionId")
private List<RoleFunction> rftb;
public Integer getiFunctionId() {
return iFunctionId;
}
public void setiFunctionId(Integer iFunctionId) {
this.iFunctionId = iFunctionId;
}
public String getsFunctionName() {
return sFunctionName;
}
public void setsFunctionName(String sFunctionName) {
this.sFunctionName = sFunctionName;
}
public String getsFunctionDetails() {
return sFunctionDetails;
}
public void setsFunctionDetails(String sFunctionDetails) {
this.sFunctionDetails = sFunctionDetails;
}
public List<RoleFunction> getRftb() {
return rftb;
}
public void setRftb(List<RoleFunction> rftb) {
this.rftb = rftb;
}
}
[/code]
[code="java"]
@Entity
@Table(name="rolefunctiontbl")
@IdClass(value=RoleFunctionPK.class)
public class RoleFunction implements Serializable{
private static final long serialVersionUID = -3218895861455447832L;
@Transient
private Integer iRoleId;
private Integer iFunctionId;
@Column(name = "iFunctionAuth", nullable = true)
private Integer iFunctionAuth;
@ManyToOne(cascade=CascadeType.ALL,optional=false)
@JoinColumn(name = "iRoleId")
private Role roleTbl;
@ManyToOne(cascade=CascadeType.ALL,optional=false)
@JoinColumn(name = "iFunctionId")
private Function functionTbl;
@Id
public Integer getiRoleId() {
return iRoleId;
}
public void setiRoleId(Integer iRoleId) {
this.iRoleId = iRoleId;
}
@Id
public Integer getiFunctionId() {
return iFunctionId;
}
public void setiFunctionId(Integer iFunctionId) {
this.iFunctionId = iFunctionId;
}
public Integer getiFunctionAuth() {
return iFunctionAuth;
}
public void setiFunctionAuth(Integer iFunctionAuth) {
this.iFunctionAuth = iFunctionAuth;
}
}
[/code]
hibernate大致可以这么写:
getSession().delete(RoleFunctionEntity);
但是不知道你的逻辑是什么?只删中间关系表就可以?还是要级联删除?