Hibernate映射(五)— 多对多

单向:


情况:

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

原理:

只有一端可以看到另一端,而另一端则看不到

关系图:



具体实现


1、实体

<span style="font-size:18px;">	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;
			}
			
			
		}</span>

2、映射文件

<span style="font-size:18px;">	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></span>


3、配置文件

<span style="font-size:18px;">	<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></span>


4、封装好的工具类:HibernateUtils

<span style="font-size:18px;">	/**
	 * 工具类(封装开启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();
				}
			}
		}
	}</span>


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


6、查询

<span style="font-size:18px;">	/**
	 * 根据用户查角色
	 */
	public void testLoad1(){
			Session session=null;
	
			try {
				//获得Session,并开启事务
				session=HibernateUtils.getSession();
				session.beginTransaction();
				
				//根据用户ID为9查询
				User user=(User)session.load(User.class,9);
				System.out.println(user.getName());
				
				//遍历该用户下的角色
				for(Iterator iter=user.getRoles().iterator(); iter.hasNext();){
					Role role=(Role)iter.next();
					System.out.println(role.getName());
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
</span>



多向:

情况:

一个用户拥有多个角色,一个角色可以包含多个用户。


原理:

将不能看见另一端作为集合放在的可看到一端


关系图



具体实现


1、实体

<span style="font-size:18px;">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:
	/**
	 * 定义角色实体
	 * @author gxq
	 *
	 */
	public class Role {
	
		private int id;
		
		private String name;
		
		private Set users;
	
		public Set getUsers() {
			return users;
		}
	
		public void setUsers(Set users) {
			this.users = users;
		}</strong></span>
	
		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;
		}
	}</span>


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"/>
			<set name="users" table="t_user_role">
				<key column="role_id"></key>
				<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"></many-to-many>
		        </set>
		</class>
	</hibernate-mapping>
			

3、配置文件、工具类、添加:与单向一致


4、查询

数据库数据


<span style="font-size:18px;">/**
	 * 根据角色查用户
	 */
	public void testLoadMany2Many(){
		Session session = null;
		try {
			//获得Session,并开启事务
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//根据角色ID为1查询
			Role role = (Role)session.load(Role.class, 1);
			System.out.println(role.getName());
			
			//遍历该角色下的用户
			for (Iterator<User> iter=role.getUsers().iterator(); iter.hasNext();) {
				
				User user = (User)iter.next();
				System.out.println(user.getName());
			}
			
			/*提交事务*/
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			//事务回滚
			session.getTransaction().rollback();
		}finally {
			//关闭session
			HibernateUtils.closeSession(session);
		}
	}</span>


结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值