Hibernate多对多操作

1:多对多映射配置

以用户和角色为例

第一步:创建实体类,用户和角色

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

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

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

User.java

package hibernate.manytomany;
import java.util.HashSet;
import java.util.Set;

public class User {
	
	private Integer user_id;//用户id
	private String user_name;//用户名称
	private String user_password;//用户密码
	private Set<Role> setuser=new HashSet<Role>();
	
	public Integer getUser_id() {
		
		return user_id;
		
	}
	
	public void setUser_id(Integer 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;
		
	}
	
	public Set<Role> getSet() {
		
		return setuser;
		
	}
	
	public void setSet(Set<Role> set) {
		
		this.setuser = set;
		
	}

}

Role.java

package hibernate.manytomany;
import java.util.HashSet;
import java.util.Set;

public class Role {
	
	private Integer role_id;//角色id
	private String role_name;//角色名称
	private String role_description;//角色描述
	private Set<User> setrole=new HashSet<User>();
	
	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_description() {
		
		return role_description;
		
	}
	
	public void setRole_description(String role_description) {
		
		this.role_description = role_description;
		
	}
	
	public Set<User> getSet1() {
		
		return setrole;
		
	}
	
	public void setSet1(Set<User> set1) {
		
		this.setrole = set1;
		
	}

}

第三步:配置映射关系

(1)基本配置

(2)配置多对多关系

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

role.hbm.xml部分代码片段

   <!-- 在角色映射配置文件中,表示所有使用者 -->
    <!--使用set标签表示所有角色  -->
    <!--set标签里有name的属性,属性值写角色实体类里面表示使用者的set集合名称  -->
    <!-- table属性是第三张表名称 -->
    <!-- inverse属性默认值:false不放弃关系维护,true放弃关系维护 -->
    <set name="setrole" cascade="save-update,delete" inverse="true" table="user_role"> 

    <!-- key标签里面配置,配置当前映射文件在第三张表外键的名称-->
    <key column="roleid"></key>

    <!-- class属性值是角色实体类全路径 ,column属性值是第三张表外键名称-->
    <many-to-many class="hibernate.manytomany.Role" column="roleid"/>
     </set>

user.hbm.xml部分代码片段

<!-- 在使用者映射配置文件中,表示所有角色 -->
    <!--使用set标签表示所有使用者  -->
    <!--set标签里有name的属性,属性值写角色实体类里面表示联系人的set集合名称  -->
    <!-- table属性是第三张表名称 -->
    <!-- inverse属性默认值:false不放弃关系维护,true放弃关系维护 -->
    <set name="setuser" cascade="save-update,delete" inverse="true" table="user_role"> 

    <!-- key标签里面配置,配置当前映射文件在第三张表外键的名称-->
    <key column="userid"></key>

    <!-- class属性值是使用者实体类全路径 ,column属性值是第三张表外键名称-->
    <many-to-many class="hibernate.manytomany.User" column="userid"/>
     </set>

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

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
    <session-factory>
          <!-- 第一部分:配置数据库信息 -->
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
          <property name="hibernate.connection.url">jdbc:mysql:///mysql_studying</property>
          <property name="hibernate.connection.username">root</property>
          <property name="hibernate.connection.password">zlj18059008512</property>
     
          <!-- 第二部分:配置Hibernate信息(可选的) -->
          
          <!-- 输出底层sql语句-->
          <property name="hibernate.show_sql">true</property>
          
          <!-- 输出底层sql语句格式 -->
          <property name="hibernate.format_ sql">true</property>
          
          <!-- Hibernate帮创建表,需要配置之后
               updat:如果已有表,更新。没有,创建。
           -->
          <property name="hibernate.hbm2ddl.auto">update</property>
          
          <!-- 配置数据库方言
                                  让hibernate框架识别不同数据库的自己持有语句
           -->
           <property name="hibernate.dialect ">org.hibernate.dialect.MySQLDialect</property>

          <!-- 在Hibernate核心配置文件中配置。目的为了绑定Session(保证单线程对象)
           -->
           <property name="hibernate.current_session_context_class">Thread</property>
           
          <!-- 第三部分:把映射文件(.hbm.xml)放入到核心文件(.cfg.xml)中 (必须要写文件路径)-->
         <mapping resource="hibernate/manytomany/role.hbm.xml"/>
         <mapping resource="hibernate/manytomany/user.hbm.xml"/>
         
    </session-factory>

</hibernate-configuration>

2:多对多级联保存(重点)

问题:根据用户保存角色
第一步:在用户配置文件中,使用set标签里的cascade属性进行配置,cascade="save-update"

user.hbm.xml部分代码片段

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

第二步:写代码实现
(1)创建用户和角色对象。把角色收到用户里面。最终保存用户就可以了。

@Test
	//演示多对多操作(级联保存)
	public void testSave() {
		
		Configuration configuration=new Configuration();
		SessionFactory sessionFactory=null;
		Session session=null;
		Transaction transaction=null;
		
		try {
			
			configuration.configure();
			sessionFactory=HibernateUtilities.getSessionFactory();
			session=HibernateUtilities.getSessionObject();
			transaction=session.beginTransaction();
			
			//添加两个用户,为每个用户添加两个角色
			//1:创建对象
			User user1=new User();
			User user2=new User();
			
			user1.setUser_id(1);
			user1.setUser_name("zlj");
			user1.setUser_password("123456");
			user2.setUser_id(2);
			user2.setUser_name("zl");
			user2.setUser_password("12345");
			
			Role role1=new Role();
			Role role2=new Role();
			Role role3=new Role();
			
			role1.setRole_id(1);
			role1.setRole_description("开车");
			role1.setRole_name("司机");
			role2.setRole_id(2);
			role2.setRole_description("打扫");
			role2.setRole_name("保洁");
			role3.setRole_id(3);
			role3.setRole_description("保卫");
			role3.setRole_name("保安");
			
			//2:建立关系把角色放到用户里
			user1.getSet().add(role1);
			user1.getSet().add(role2);
			user2.getSet().add(role3);
			user2.getSet().add(role2);
			
			//3:保存用户
			session.save(user2);
			session.save(user1);

			transaction.commit();
		} catch (Exception e) {

			transaction.rollback();
			
		}finally {
			
			session.close();
			sessionFactory.close();
			
		}
		
	}

3:多对多级删除

//演示多对多操作(级联删除)
		public void testDelete() {
			
			Configuration configuration=new Configuration();
			SessionFactory sessionFactory=null;
			Session session=null;
			Transaction transaction=null;
			
			try {
				
				configuration.configure();
				sessionFactory=HibernateUtilities.getSessionFactory();
				session=HibernateUtilities.getSessionObject();
				transaction=session.beginTransaction();
				
				User user=session.get(User.class, 1);
				
				session.delete(user);

				transaction.commit();
			} catch (Exception e) {

				transaction.rollback();
				
			}finally {
				
				session.close();
				sessionFactory.close();
				
			}
			
		}

4:维护第三张表

	
		//演示多对多操作(维护第三张表)
			public void testMaintain() {
				
				Configuration configuration=new Configuration();
				SessionFactory sessionFactory=null;
				Session session=null;
				Transaction transaction=null;
				
				try {
					
					configuration.configure();
					sessionFactory=HibernateUtilities.getSessionFactory();
					session=HibernateUtilities.getSessionObject();
					transaction=session.beginTransaction();
					
					//演示让某个用户拥有某个角色
					//1:查询指定用户和角色
					User user=session.get(User.class, 1);
					Role role=session.get(Role.class, 1);
					
					//2:把角色放到指定用户里
					user.getSet().add(role);
					
					/**演示让某个用户不拥有某个角色
					//1:查询指定用户和角色
					User user=session.get(User.class, 1);
					Role role=session.get(Role.class, 1);
					
					//2:把角色放到指定用户里,然后移除
					user.getSet().remove(role);*/
					
					transaction.commit();
				} catch (Exception e) {

					transaction.rollback();
					
				}finally {
					
					session.close();
					sessionFactory.close();
					
				}
				
			}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值