Hibernate(7)Hibernate多對多

 

 

多對多關係   

員工表  和角色表    一個員工能夠對應多個角色 一個角色下面也能對應多個員工 

表中的表達 

 

實體類中的表達

創建實體類

通過set集合關聯表關係

package cn.ycsj.domain;

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

public class User {
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private Character user_state;
    private Set<Role> roles = new HashSet<Role>();


    public Long getUser_id() {
     return user_id;
    }

    public void setUser_id(Long user_id) {
     this.user_id = user_id;
    }

    public String getUser_code() {
     return user_code;
    }

    public void setUser_code(String user_code) {
     this.user_code = user_code;
    }

    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 Character getUser_state() {
     return user_state;
    }

    public void setUser_state(Character user_state) {
     this.user_state = user_state;
    }

    public Set<Role> getRoles() {
     return roles;
    }

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

配置文件

<?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 package="cn.ycsj.domain" >
	<class name="User" table="sys_user" >
		<id name="user_id"  >
			<generator class="native"></generator>
		</id>
		<property name="user_code"></property>
		<property name="user_name"></property>
		<property name="user_password"></property>
		<property name="user_state"></property>

		<!--多對多關係表達-->
		<!--    name 集合屬性名
				table 配置中間表名
				key元素下的column   外鍵  別人引用我的外鍵
				manytomany
					class  我與那個類是多對多關係
					column  外鍵  我引用別人的外鍵列
		-->
		<set name="roles" table="sys_user_role">
			<key column="user_id"></key>
			<many-to-many class="Role" column="role_id"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

角色表

package cn.ycsj.domain;

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

public class Role {
    private Long role_id;
    private String role_name;
    private String role_memo;
    private Set<User> users = new HashSet<User>();


    public Long getRole_id() {
        return role_id;
    }

    public void setRole_id(Long 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;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}

配置文件

<?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 package="cn.ycsj.domain" >
	<class name="Role" table="sys_role" >
		<id name="role_id"  >
			<generator class="native"></generator>
		</id>
		<property name="role_name"></property>
		<property name="role_memo"></property>

		<!--多對多關係表達-->
		<!--    name 集合屬性名
				table 配置中間表名
				key元素下的column   外鍵  別人引用我的外鍵
				manytomany
					class  我與那個類是多對多關係
					column  外鍵  我引用別人的外鍵列
		-->
		<set name="users" table="sys_user_role">
			<key column="role_id"></key>
			<many-to-many class="User" column="user_id"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

添加掃描到主配置文件

隨便運行一段程序,hibernate會自動生成表結構

操作

  public void  func(){
        //1.獲得session
        Session session = HibernateUtils.getCurrentSession();

        //2.開啓事務
        Transaction tx = session.beginTransaction();
        //3.操作
        //創建user和role
        User user1 = new User();
        User user2 = new User();
        Role r1 = new Role();
        Role r2 = new Role();
        user1.setUser_name("xxx");
        user2.setUser_name("yyy");
        r1.setRole_name("總經理");
        r2.setRole_name("祕書");
        //user關係表達
        user1.getRoles().add(r1);
        user1.getRoles().add(r2);
        user2.getRoles().add(r2);

        //role關係表達
/*        r1.getUsers().add(user1);
        r2.getUsers().add(user1);
        r2.getUsers().add(user2);*/
        //調用save方法
        session.save(user1);
        session.save(user2);
        session.save(r1);
        session.save(r2);

        //4.提交事務
        tx.commit();

在紅色部分沒有註釋時會報錯,因爲兩張表在執行的時候都需要維護關係,向中間表sys_user_role中插入數據,出現異常

解決方法1  註釋掉role關係表達 

解決方式2 向role.hbm.xml中位置調價inverse屬性

-->
<!--使用inverse屬性
 true放棄維護關係
 false 維護
 結論在開發中 無論遇到多對多 一對多關係,都要一方放棄維護關係
 根據業務關係來確定哪一方來放棄維護
 比如錄入員工 需要指定所屬角色 那麼業務方向就是員工維護,角色需要放棄維護關係
 -->
<set name="users" table="sys_user_role" inverse="true">
   <key column="role_id"></key>
   <many-to-many class="User" column="user_id"></many-to-many>
</set>

爲用戶添加角色

 /**
     * 爲用戶增加一個角色
     */
    @Test
    public void  func1(){
        //1.獲得session
        Session session = HibernateUtils.getCurrentSession();

        //2.開啓事務
        Transaction tx = session.beginTransaction();
        //3.操作
        User user = session.get(User.class, 1l);  //持久化狀態
        //創建角色
        Role r1 = new Role();  //瞬時狀態
        r1.setRole_name("保安");
        user.getRoles().add(r1);
        //將角色裝換爲持久化狀態
        session.save(r1);//將瞬時狀態裝換爲持久化狀態
        //4.提交事務
        tx.commit();
    }

配置級聯屬性

該屬性不建議使用

user.hbm.xml中

<set name="roles" table="sys_user_role" cascade="save-update">
   <key column="user_id"></key>
   <many-to-many class="Role" column="role_id"></many-to-many>
</set>

上面的代碼能省略session.save(r1)  級聯屬性幫助保存持久化狀態下的瞬時狀態。

 

/**
 * 爲用戶刪除一個角色
 */
@Test
public void  func2(){
    //1.獲得session
    Session session = HibernateUtils.getCurrentSession();

    //2.開啓事務
    Transaction tx = session.beginTransaction();
    //3.操作
    User user = session.get(User.class, 1l);  //持久化狀態
    Role role = session.get(Role.class,2l);
    //將角色從用戶中移除
    user.getRoles().remove(role);
    //將用戶主從角色中移除
    role.getUsers().remove(user);

    //4.提交事務
    tx.commit();
}

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章