Hibernate学习(八)

Hibernate多对多操作

多对多映射配置

第一步 创建实体类,用户和联系人

package cn.itcast.manytomany;

import java.util.HashSet;
import java.util.Set;

public class Role {

	private Integer role_id;
	private String role_name;
	private String role_memo;
	//一个角色有多个用户
    private Set<User> setUser=new HashSet<User>();
    
	
	public Set<User> getSetUser() {
		return setUser;
	}
	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	}
	public Integer getRole_id() {
		return role_id;
	}
	public void setRole_id(Integer role_id) {
		this.role_id = role_id;
	}
	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}
	public String getRole_memo() {
		return role_memo;
	}
	public void setRole_memo(String role_memo) {
		this.role_memo = role_memo;
	}
	
}
package cn.itcast.manytomany;

import java.util.HashSet;
import java.util.Set;

public class User {
	private int user_id;
	private String user_name;
	private String user_password;

	//一个用户可以有多个角色
	private Set<Role> setRole=new HashSet<Role>();
	
	public Set<Role> getSetRole() {
		return setRole;
	}
	public void setSetRole(Set<Role> setRole) {
		this.setRole = setRole;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
	
	
}


第二步 让两个实体类之间互相表示

(1)用户里面表示所有角色,使用set集合

//一个用户可以有多个角色
	private Set<Role> setRole=new HashSet<Role>();
	
	public Set<Role> getSetRole() {
		return setRole;
	}
	public void setSetRole(Set<Role> setRole) {
		this.setRole = setRole;
	}

(2)一个角色中有多个用户,使用set集合

//一个角色有多个用户
    private Set<User> setUser=new HashSet<User>();
    
	
	public Set<User> getSetUser() {
		return setUser;
	}
	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	}

第三步 配置映射关系

(1)基本配置

role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!-- 1配置类和表对应 
             name属性:实体类全路径
             table属性:表示数据库表的名称
        -->
        <class name="cn.itcast.manytomany.Role" table="t_role">
        <!-- 2配置实体类id和表id对应 
        hibernate要求实体类有一个属性是唯一的值
        hibernate要求表有一个字段作为唯一字段
        
        -->
        <!-- id标签 
        	 name属性:实体类id属性名称 uid
        	 column属性:生成表字段名称(可以自己任意起名)
            -->

       
        <id name="role_id" column="role_id">
        <!-- 设置数据库表id增长的策略 
        	 native:生成表id值主键就是自动增长	
        -->
        <generator class="native"></generator>
        </id>
        <!-- 配置其他属性和表的字段对应 
        	 name属性:实体类属性名称
        	 column属性:表中字段名称	(可以自己任意起名)
        -->
        <property name="role_name" column="role_name"></property>
        <property name="role_memo" column="role_memo"></property>
       
        </class>
    </hibernate-mapping>
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!-- 1配置类和表对应 
             name属性:实体类全路径
             table属性:表示数据库表的名称
        -->
        <class name="cn.itcast.manytomany.User" table="t_user">
        <!-- 2配置实体类id和表id对应 
        hibernate要求实体类有一个属性是唯一的值
        hibernate要求表有一个字段作为唯一字段
        
        -->
        <!-- id标签 
        	 name属性:实体类id属性名称 uid
        	 column属性:生成表字段名称(可以自己任意起名)
            -->

       
        <id name="user_aid" column="user_id">
        <!-- 设置数据库表id增长的策略 
        	 native:生成表id值主键就是自动增长	
        -->
        <generator class="native"></generator>
        </id>
        <!-- 配置其他属性和表的字段对应 
        	 name属性:实体类属性名称
        	 column属性:表中字段名称	(可以自己任意起名)
        -->
        <property name="user_name" column="user_name"></property>
        <property name="user_password" column="user_password"></property>
        
        </class>
    </hibernate-mapping>

(2)配置多对多关系

在用户里面表示所有角色,使用set标签

     <!-- 在用户里面表示所有角色,使用set标签
        name属性,角色set集合名称 
        table属性值:第三张表的名称
        -->
        <set name="setRole" table="user_role">
   <!--      key标签里面配置
        配置当前映射文件在第三张表外键名称 -->
        <key column="userid"></key>
        <!-- class:角色实体类全路径
         	column:角色在第三张表外键名称
         -->
        <many-to-many class="cn.itcast.manytomany.Role" column="roleid"></many-to-many>
        </set>

在角色里面表示所有用户,使用set标签

 <!-- 在角色里面表示所有用户,使用set标签
       
        -->
        <set name="setUser" table="user_role">
        <!-- 角色在第三张表外键 -->
        <key column="roleid"></key>
        <many-to-many class="cn.itcast.manytomany.User" column="userid"></many-to-many>
        </set>

第四步 再核心配置文件中引入映射文件

测试


多对多级联保存

根据用户保存角色

第一步 在用户配置文件中set标签进行配置,cascade值save-update

<set name="setRole" table="user_role" cascade="save-update">

第二步 写代码实现

(1)创建用户换个角色对象,把角色放到用户里面,最终保存用户就可以了。


多对多级联删除

第一步 在set标签进行配置,在cascade值delete

<set name="setRole" table="user_role" cascade="save-update,delete">

第二步 删除用户

				//演示多对多级联删除
        @Test
        public void testDelete() {
            SessionFactory sessionFactory=null;
            Session session=null;
            Transaction tx=null;
            try {
                sessionFactory=HibernateUtils.getSessionFactory();
                session=sessionFactory.openSession();
                tx=session.beginTransaction(); 
                
                User user=session.get(User.class, 1);
                session.delete(user);
                
                
                tx.commit();
            }
            catch(Exception e){
                tx.rollback();
            }finally {
                session.close();
                sessionFactory.close();
            }
        }    

维护第三张表关系

1 用户和角色是多对多关系,维护关系通过第三张表维护

2 让某个用户有某个角色

第一步 根据id查询用户和角色

第二步 把角色放到用户里面

(1)把角色对象放到用户set集合

//演示维护第三张表
				@Test
				public void testTable() {
					SessionFactory sessionFactory=null;
					Session session=null;
					Transaction tx=null;
					try {
						sessionFactory=HibernateUtils.getSessionFactory();
						session=sessionFactory.openSession();
						tx=session.beginTransaction(); 
						
						//让某个用户有某个角色
						//让lucy有经纪人角色
						//1查询lucy和经纪人
						User lucy=session.get(User.class, 1);
						Role role =session.get(Role.class, 3);
						
						//2把角色放到用户的set集合里面
						lucy.getSetRole().add(role);
						
						
						tx.commit();
					}
					catch(Exception e){
						tx.rollback();
					}finally {
						session.close();
						sessionFactory.close();
					}
				}


3 让某个用户没有某个角色

第一步 根据id查询用户和角色

第二步 从用户里面把角色去掉

(1)从set集合里面把角色移除

@Test
				public void testTableDel() {
					SessionFactory sessionFactory=null;
					Session session=null;
					Transaction tx=null;
					try {
						sessionFactory=HibernateUtils.getSessionFactory();
						session=sessionFactory.openSession();
						tx=session.beginTransaction(); 
						
						//让某个用户没有某个角色
						User user=session.get(User.class, 2);
						Role role=session.get(Role.class, 3);
						Role role1=session.get(Role.class, 1);
						
						user.getSetRole().remove(role);
						user.getSetRole().remove(role1);
						
						tx.commit();
					}
					catch(Exception e){
						tx.rollback();
					}finally {
						session.close();
						sessionFactory.close();
					}
				}	

猜你喜欢

转载自blog.csdn.net/pan_xi_yi/article/details/80666138