0 0

Hibernate4多对多中间表维护?0

角色role和权限perm是多对多关系,在中间表t_role_perm中有一个角色对应多个权限,我现在想取消几个权限,一般的数据库方式就是 delete from t_role_perm where role_id=? and perm_id=?就可以了,但是hibernate怎么才能达到这样的效果?
2014年7月11日 00:09

3个答案 按时间排序 按投票排序

0 0

采纳的答案

这得看你是怎么写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配置的我们再讨论

2014年7月11日 09:54
0 0

我之前也做过类似的,我们是role、function、及中间表rolefunction

@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;
	}
	
}

@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;
	}

}

@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;
	}

}


hibernate大致可以这么写:
getSession().delete(RoleFunctionEntity);
但是不知道你的逻辑是什么?只删中间关系表就可以?还是要级联删除?

2014年7月11日 09:10
0 0

不需要这样删除吧, 可以删除对象的方式吧
roleEntity.getUserGroups().clear();
session.delete(roleEntity);

2014年7月11日 09:01

相关推荐

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。...希望本文能对你理解Hibernate的多表联合查询有所帮助。

    hibernate5_ManyToMany多对多单向维护

    在Hibernate中,实现多对多关联通常需要创建一个中间表来存储两个实体之间的关联信息。然而,"单向维护"意味着在一个实体类中定义了关联,而在另一个实体类中没有对应的引用。这有助于简化模型,减少冗余,但也需要...

    Hibernate(多对多表操作)

    在Hibernate中,实现多对多关系需要通过关联表(也称为中间表或连接表)来完成。这个关联表通常包含两个外键,分别对应于两个参与关系的实体。以下是一个具体的步骤详解: 1. **定义实体类**:首先,为参与多对多...

    Hibernate多对多实例+数据库代码

    通过查看代码和运行示例,开发者可以深入理解Hibernate是如何自动处理复杂的关联操作,比如通过中间表实现多对多的添加、删除和查找。 **总结** 这个"Hibernate多对多实例+数据库代码"涵盖了ORM的核心概念,特别是...

    hibernate(多对多关系映射)

    在Hibernate中,多对多关系通常通过中间表来实现,这个中间表包含了两个实体的主键作为外键。你需要在实体类中定义对应的集合属性,并在对应的`@ManyToMany`注解中指定关联的实体和中间表的信息。例如: ```java ...

    hibernate 多对多源代码

    总结,Hibernate的多对多关系映射提供了灵活的方式处理复杂的数据库关联,通过`@ManyToMany`和`@JoinTable`等注解,可以轻松地定义和维护这种关系。然而,使用时需注意性能优化,确保系统的高效运行。

    Hibernate ORM - 多对多双向连接表关联关系

    6. **源码分析**:为了更好地理解这一过程,你可以查看Hibernate源码,了解它如何处理多对多关联的SQL语句生成、中间表的操作以及事务管理。这有助于提高对Hibernate框架的理解。 通过以上步骤,我们可以在...

    hibernate 映射关系学习入门 多对多实体映射

    在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个表的外键。 三、配置多对多映射 在Hibernate中,配置多对多映射通常需要以下几个步骤: 1. **实体类定义**:为每个实体...

    hibernate一对多、多对一、一对一、多对多配置实例

    本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...

    hibernate双向多对多关联映射(注解版)

    多对多关系通常需要一个中间表来存储两个实体的关联信息,但在Hibernate中,我们不需要手动创建这个中间表。`@JoinTable`注解可以用来定义中间表的详细信息,包括表名、连接字段等。 3. **关系的维护**: 在双向...

    hibernate多对多双向关联

    3. **中间表**:多对多关系通常需要一个中间表来存储两个表的连接。在Hibernate中,可以通过`@JoinTable`注解定义这个中间表,包括它的名字、连接两个实体的外键等信息。 4. **关联维护**:双向关联需要在两个实体...

    hibernate单向多对多映射(XML版)

    在Hibernate中,实现多对多映射通常涉及三个元素:实体类、关联表(也称为中间表)以及XML映射文件。实体类代表数据库中的表,而关联表则用于存储双方实体的关联关系。XML映射文件是 Hibernate 了解这些实体及其关系...

    Hibernate多对多数据表操作-插入

    总结来说,使用Hibernate处理多对多关系,关键在于理解`@ManyToMany`注解的使用,中间实体类的设计(如果需要),以及如何在代码中正确维护实体间的关联。希望这些内容能帮助你理解Hibernate在多对多关系处理上的...

    Hibernate基于连接表的一对多单向关联

    在一对多关联中,通常会通过一个连接表(或称为中间表)来维护两个表之间的关系。这个表通常包含两个外键,分别引用两个参与关联的表。在Hibernate中,这种关联可以通过配置XML映射文件或者使用注解来实现。 接下来...

    hibernate框架多对多测试案例

    在Hibernate中,实现多对多映射通常涉及到三个主要元素:关联表、中间实体和关联映射。关联表是用于存储两个实体间连接信息的特殊表,通常包含两个实体的主键作为其外键。中间实体则可以是无意义的数据结构,仅用于...

    Hibernate多对多

    **标题:“Hibernate多对多”** 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作。在关系数据库中,表与表之间的关系可以是一对一、一对多或多对多。本...

    CH4Hibernate2,一对多,多对一,多对多实现增删改查

    `CH4Hibernate2`项目专注于使用Hibernate框架实现数据库中的一对多、多对一和多对多关系的增删改查操作。Hibernate作为Java领域中最流行的ORM(对象关系映射)框架,能够简化数据库操作,将SQL语句与Java代码分离,...

    Hibernate多对多关联添加及查询示例

    在上述代码中,`@ManyToMany`注解定义了多对多关联,`@JoinTable`指定了中间表的名称和连接列。`mappedBy`属性用于指定另一端的关联字段,这表示`Course`实体的`students`集合是由`Student`实体的`courses`集合维护...

    hibernate实现多对多关联关系源码

    在Hibernate中,多对多关联通常通过中间表或关联表(association table)来实现,这个表包含两个实体的主键作为外键。以下是实现多对多关联关系的关键步骤: 1. **定义实体类**:首先,为涉及多对多关联的两个实体...

Global site tag (gtag.js) - Google Analytics