Hibernate映射(五)— 多对多

单向:

情况:

一个用户拥有多个角色,一个角色可以包含多个用户。单用户可看到角色,角色看不到用户

原理:

两端都可以看到彼此

关系图:

具体实现

1、实体
	user:
		/**
		 * 定义用户实体
		 * @author gxq
		 *
		 */
		public class User {

			private int id;

			private String name;

			private Set roles;

			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 getRoles() {
				return roles;
			}

			public void setRoles(Set roles) {
				this.roles = roles;
			}
		}

	role:
		package com.bjpowernode.hibernate;

		/**
		 * 定义角色实体
		 * @author gxq
		 *
		 */
		public class Role {

			private int id;

			private String name;

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

		}

2、映射文件
	User.hbm.xml:
		<hibernate-mapping>
			<class name="com.bjpowernode.hibernate.User" table="t_user">
				<id name="id">
					<generator class="native"/>
				</id>
				<property name="name"/>

				<set name="roles" table="t_user_role">
					<key column="user_id"></key>
					<many-to-many class="com.bjpowernode.hibernate.Role"
column="role_id"></many-to-many>
				</set>
			</class>
		</hibernate-mapping>

	Role.hbm.xml:
		<hibernate-mapping>
			<class name="com.bjpowernode.hibernate.Role" table="t_role">
				<id name="id">
					<generator class="native"/>
				</id>
				<property name="name"/>
			</class>
		</hibernate-mapping>
3、配置文件
	<hibernate-configuration>
		<session-factory>
			<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="hibernate.connection.url">
	        <![CDATA[jdbc:mysql://localhost:3306/Hibernate?useUnicode=true&characterEncoding=utf8]]>
			</property>
			<property name="hibernate.connection.username">root</property>
			<property name="hibernate.connection.password">root</property>
			<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
			<property name="hibernate.hbm2ddl.auto">update</property>
			<property name="hibernate.show_sql">true</property>
			<!--
			<property name="hibernate.format_sql">true</property>
			 -->

			<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
			<mapping resource="com/bjpowernode/hibernate/Role.hbm.xml"/>
		</session-factory>
	</hibernate-configuration>

4、封装好的工具类:HibernateUtils
	/**
	 * 工具类(封装开启session和事务)
	 * @classname   HibernateUtils
	 * @author      高晓青
	 * @date        2015-4-16 下午2:56:42
	 * @version     hibernate
	 */
	public class HibernateUtils {
		private static SessionFactory factory;

		static{
			try {
				//默认读取的是hibernate.cfg.xml
				Configuration cfg = new Configuration().configure();

				//建立sessionFactory
				factory = cfg.buildSessionFactory();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		//开启session
		public static Session getSession(){
			return factory.openSession();
		}

		//关闭session
		public static void closeSession(Session session){
			//判断是否为空
			if(session!=null){
				//判断是否是打开状态再进行关闭
				if(session.isOpen()){
					session.close();
				}
			}
		}
	}

5、添加
	public void testSaveManyToMany1() {
			Session session = null;

			try {
				session = HibernateUtils.getSession();
				session.beginTransaction();

				// 定义经理角色并赋值
				Role managerRole = new Role();
				managerRole.setName("商务经理");
				session.save(managerRole);

				// 定义主管角色并赋值
				Role directorRole = new Role();
				directorRole.setName("商务主管");
				session.save(directorRole);

				// 定义职员角色并赋值
				Role clerkRole = new Role();
				clerkRole.setName("录入人员");
				session.save(clerkRole);

				// 设置管理员,并为其赋予橘色
				User admin = new User();
				admin.setName("张三");
				Set<Role> managerSet = new HashSet<Role>();
				managerSet.add(managerRole);
				managerSet.add(directorRole);
				managerSet.add(clerkRole);

				admin.setRoles(managerSet);
				session.save(admin);

				// 设置一般用户,并为其赋予角色
				User commonUser = new User();
				commonUser.setName("李四");
				Set<Role> commonSet = new HashSet<Role>();
				commonSet.add(directorRole);
				commonSet.add(clerkRole);
				commonUser.setRoles(commonSet);
				session.save(commonUser);

				session.getTransaction().commit();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

时间: 2024-10-05 05:58:27

Hibernate映射(五)— 多对多的相关文章

Hibernate映射( 多对一、一对一、一对多、多对多)的配置方法

hihernate一对多关联映射(单向Classes----->Student) 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同 在一一端维护关系的缺点: * 如果将t_student表里的classesid字段设置为非空,则无法保存 * 因为不是在student这一端维护关系,所以student

Hibernate映射关系-多对多

接着上几篇博客,hibernate的映射关系,今天我们说说基本关系的最后一种:多对多. 一 .多对多关系 现象:多对多关系,在生活中很常见,就那学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择.还有就是一个用户可以有多个角色,一个角色可以有多个人,等等这样的例子很多. hibernate实现:多对多关联关系采用第三张表的方式来实现,将多对多转化为两个一对多. 当然,多对多也是有方向的.拿用户--角色来画类图. 1.单向关联--用户关联角色 多对多关系在hbm文

Hibernate ManyToOne Mappings 多对一关联映射

Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 例子:多个员工对应一个地址. 一.创建hibernate.cfg.xml 配置文件: 注意数据库名.用户名.密码是否填写正确. <?xml version="1.0" en

一口一口吃掉Hibernate(五)——一对多单向关联映射

版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate(四)--多对一单向关联映射>中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射. 可能有人会对这2篇博客的题目有点混淆不清,跟日常说的关系有点不同.我们日常说的比如父子关系,夫妻关系都是说的双向关系,而现在讨论的则是单向关系,所以也就有了多对一和一对多的说法. 二者的关系其实很简单,只是

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射. 在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之间的关系就是多对多,多对多关联

Hibernate映射关系之多对多

1.用户表user和优惠券coupon存在多对多的关系,一个用户可以拥有多个优惠券,一个优惠券可以从属于多个用户. 2.user.java,创建了中间表tb_user_coupon (1)JoinTable表示中间表的 (2) /** * 一个用户可以拥有多个优惠券 但优惠券只有自己的属性,没有用户的引用 单边的一对多关系 */ @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST }) @JoinTable(n

hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持久化类的属性的名字 column: 设定和持久化类的属性对应的表的外键 class:设定待映射的持久化类的属性的类型 建立1所对应的封装类,这儿只写属性,setter和getter就不写了: private Integer customerId; private String customerName; 建立

千山万水之Hibernate(四)——关联映射(多对一)

在上一篇文章(<千山万水之Hibernate(三)--基本映射 >)中,我们介绍了怎样通过Hibernate进行最基本的单实体映射以及Hibernate设计的一些基本原理,本篇文章将介绍关联映射中的多对一映射是如何实现的. 原理分析 我们拿学生和班级为示例,学生属于某一个班级,而且多个学生是有可能属于同一个班级的,相应的实体关系图为: Class的映射文件向上一篇我们介绍到的基本映射文件那样编写便可以,而对于Student实体,我们需要从Student中得出对应班级,而Student与Clas

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

上篇博文[SSH进阶之路]Hibernate映射--一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数据冗余的问题. 举例 一个用户(User)对多个角色(Role),一个角色对多个用户. 分类 单向的多对多关联映射(单向User--->Role) 对象模型 关系模型 实例

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l