`
oham_一1一
  • 浏览: 51324 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate使用——多对多关联示例

阅读更多

多对多关联

 

在hibernate的关联映射当中,多对多的关联映射需要借助中间表完成。由于多对多关联的性能不佳(由于引入中间表,一次读取操作需要反复数次查询),因此设计中应该避免大量使用。

 

一个例子:角色Role与权限privilege的关系是典型的一对多关系,现有一个军团,一个军团里有团长,将军,军师和士兵这几个角色,在一个军团里,团长拥有全部权限,可以任命手下,发起团战,发起讨伐Boss和日常个人训练,将军和军师除了没有任命权限,其他的都有,而士兵只有日常个人训练这一权限。。。


TRole.java

package learnHibernate.bean;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


public class TRole implements Serializable{
	private static final long serialVersionUID = -2404169291623739243L;
	
	private int id;
	private String name;
	
	private Set<TPrivilege> privileges = new HashSet<TPrivilege>();
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<TPrivilege> getPrivileges() {
		return privileges;
	}
	public void setPrivileges(Set<TPrivilege> privileges) {
		this.privileges = privileges;
	}
}

 TRole.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="learnHibernate.bean">
	<class name="TRole" table="t_role">
		<id name="id" column="id" type="java.lang.Integer">
			<generator class="native"/>
		</id>
		
		<property name="name" column="name" type="java.lang.String"/>
		
		<set name="privileges"
			 table="t_role_privilege"
			 lazy="false"
			 cascade="save-update">
			 
			 <key column="rid"/>
			 <many-to-many class="TPrivilege" column="pid"/>
		</set>
	</class>
	
</hibernate-mapping>

 

TPrivilege.java

package learnHibernate.bean;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class TPrivilege implements Serializable{
	private static final long serialVersionUID = -5315523735464709855L;
	
	private int id;
	private String name;
	
	private Set<TRole> roles = new HashSet<TRole>(); 
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<TRole> getRoles() {
		return roles;
	}
	public void setRoles(Set<TRole> roles) {
		this.roles = roles;
	}
}

 TPrivilege.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="learnHibernate.bean">
	<class name="TPrivilege" table="t_privilege">
		<id name="id" column="id" type="java.lang.Integer">
			<generator class="native"/>
		</id>
		
		<property name="name" column="name" type="java.lang.String"/>
		
		<set name="roles"
			 table="t_role_privilege"
			 lazy="false"
			 inverse="true"
			 cascade="save-update">
			 
			 <key column="pid"/>
			 <many-to-many class="TRole" column="rid"/>
		</set>
	</class>
	
</hibernate-mapping>

 

注意映射文件中,cascade设置为“save-update”,是因为对于多对多的逻辑而言,很少出现删除一方需要级联删除所有关联数据的情况,如删除一个“团长”角色,不会删除其包含的所有权限,同样,删除一个权限,不会删除与之关联的所有角色。

多对多的两方不能都是主控方,也就是说,要在其中的一个映射配置中设置inverse为true。没有主控方也不行,因为那样hibernate不会插中间表。

 

执行代码:

TRole r1 = new TRole();
		r1.setName("Regimental commander");
		TRole r2 = new TRole();
		r2.setName("General");
		TRole r3 = new TRole();
		r3.setName("Military adviser");
		TRole r4 = new TRole();
		r4.setName("Private");
		
		TPrivilege p1 = new TPrivilege();
		p1.setName("Assignment");
		TPrivilege p2 = new TPrivilege();
		p2.setName("Expedition");
		TPrivilege p3 = new TPrivilege();
		p3.setName("Trainning");
		
		r1.getPrivileges().add(p1);
		r1.getPrivileges().add(p2);
		r1.getPrivileges().add(p3);
		
		r2.getPrivileges().add(p2);
		r2.getPrivileges().add(p3);
		
		r3.getPrivileges().add(p2);
		r3.getPrivileges().add(p3);
		
		r4.getPrivileges().add(p3);
		
		p1.getRoles().add(r1);
		
		p2.getRoles().add(r1);
		p2.getRoles().add(r2);
		p2.getRoles().add(r3);
		
		p3.getRoles().add(r1);
		p3.getRoles().add(r2);
		p3.getRoles().add(r3);
		p3.getRoles().add(r4);
		
		SessionFactory factory = HibernateLocalUtil.getSessionFactory();
		Session session = factory.openSession();
		Transaction tx = session.beginTransaction();
		
		//多对多关联必须同时对关联双方进行保存
		session.save(r1);
		session.save(r2);
		session.save(r3);
		session.save(r4);
		
		session.save(p1);
		session.save(p2);
		session.save(p3);
		tx.commit();
		session.close();

 输出sql:

Hibernate: 
    insert 
    into
        t_role
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_privilege
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_role
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_privilege
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_role
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_role
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_privilege
        (name) 
    values
        (?)

 

  • 大小: 10.1 KB
分享到:
评论

相关推荐

    Hibernate使用——入门

    **Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...

    Hibernate总结——课程管理

    本教程将深入探讨如何使用Hibernate来实现一个简单的课程管理系统,涵盖多对多关联映射以及CRUD操作。 ### Hibernate概述 Hibernate是一个开源的ORM框架,它允许开发者使用Java对象来表示数据库中的记录,从而避免...

    Hibernate ORM - 一对多双向组合关联关系

    这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与多个子实体相对应,而双向则表示这种关系是相互的,即父实体...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    jpa之使用hibernate示例代码

    6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...

    Hibernate教程05_关系映射之一对一双向外键关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一”双向外键关联。这种关联类型在数据库设计中很常见,尤其是在处理具有紧密耦合的实体时。Hibernate作为Java中广泛使用的对象关系...

    Hibernate教程07_关系映射之一对一双向主键关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一双向主键关联”。这种关联类型是数据库设计中的常见模式,它允许两个实体类之间通过共享相同的主键来建立关联。在Java应用中,...

    hibernate多对多关联的问题

    在使用Hibernate框架处理实体间多对多关系时,经常会遇到一个棘手的问题——如何有效地管理中间关联表(如`role_popedom`),特别是在执行删除和更新操作时。本文将基于一个具体的示例场景,深入探讨这一问题,并...

    J2EE示例项目——注册

    6. **实体类**:表示数据库表的Java类,它们通过Hibernate注解或XML映射文件与数据库表进行关联。 7. **数据库表**:如`users`表,存储用户注册信息。 通过这个项目,开发者可以学习到如何整合Struts和Hibernate,...

    Hibernate数据关联映射与继承策略

    在`java组件——hibernate.ppt`和`HibernatePractice`中,可能会包含关于如何在实际项目中设置这些映射和继承策略的示例。例如,如何配置 XML 映射文件(hbm.xml)或使用注解进行映射,以及如何在代码中操作这些关联...

    简单的SSH整合示例——用户登录功能

    通过Hibernate,可以编写HQL(Hibernate Query Language)或者使用Criteria API来查询用户信息。同时,Hibernate还处理了数据的持久化,如保存、更新和删除用户信息。 **4. 用户登录流程** - 用户填写用户名和密码...

    hibernate 关联映射(三) one to one(双向)

    总结来说,Hibernate的双向一对一关联映射涉及两个实体类之间的相互引用,需要在每个实体类上使用`@OneToOne`注解,并通过`mappedBy`指定关联的方向。此外,主键共享是通过`@PrimaryKeyJoinColumn`注解实现的。理解...

    HIBERNATE doc_document_官方文档_4.3.6_final_2014_8

    - **Hibernate教程**: 包括第一部分——第一个Hibernate应用程序,第二部分——映射关联,第三部分——EventManager Web应用程序。每部分都提供了详细的步骤和代码示例,让开发者能够通过实践来学习Hibernate的使用...

    Hibernate5实例程序

    Hibernate支持多种关系映射,如一对一(`@OneToOne`)、一对多(`@OneToMany`)、多对一(`@ManyToOne`)和多对多(`@ManyToMany`)。每种关系映射都有相应的配置方法。 11. **懒加载(Lazy Loading)** 通过`@...

    Hibernate 框架测试版本

    Hibernate 支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过这些注解,你可以定义实体之间的关联关系。 10. **实用工具** Hibernate 提供了...

    hibernate.jar

    5. 支持关联映射:一对多、一对一、多对多等各种关联关系的映射。 6. 插件扩展:例如,Hibernate Search允许对数据库进行全文搜索。 六、最佳实践 - 避免在循环中使用Session,以免引发内存泄漏。 - 使用...

    hibernate-3.2.6下载

    5. 对多种数据库的支持:Hibernate可以轻松地与Oracle、MySQL、PostgreSQL等多种数据库配合使用。 6. 可扩展性:允许开发者通过插件机制自定义行为,如实体监听器、类型转换器等。 7. 性能优化:包括更有效的缓存...

    hibernate3.6 文档(pdf 格式)

    - **单向关联与连接表**:介绍如何使用连接表来映射一对多和多对一关系。 - **双向关联**:探讨双向关联的实现方法,包括一对多和多对一关系。 - **双向关联与连接表**:说明如何使用连接表来实现双向关联。 #### ...

    hibernate压缩包

    在这个“hibernate压缩包”中,包含的两个项目——HibCustomerProject和HibCustomerOrders,很可能是两个示例应用,用于展示Hibernate在实际开发中的使用。 首先,我们来看看HibCustomerProject。这个项目可能是一...

Global site tag (gtag.js) - Google Analytics