1.实体类的多对多的关系映射

一个用户可以有多个角色

User.java

public class User {
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private String user_state;
    // 设置多对多关系:表示一个用户选择多个角色?
    // 放置的是角色的集合
    private Set<Role> roles = new HashSet<Role>();
}

 Role.java

public class Role {
    private Long role_id;
    private String role_name;
    private String role_memo;
    // 一个角色被多个用户选择:
    // 放置的是用户的集合
}

 2.映射文件的多对多的关系映射

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>
    <class name="com.work.entity.User" table="sys_user">
        <!-- 建立OID与主键的映射 -->
        <id name="user_id" column="user_id">
            <generator class="native"/>
        </id>
        <!-- 建立普通属性与字段映射 -->
        <property name="user_code" column="user_code"/>
        <property name="user_name" column="user_name"/>
        <property name="user_password" column="user_password"/>
        <property name="user_state" column="user_state"/>
        <!-- 建立与角色的多对多的映射关系 -->
        <!-- 
            set标签
                * name        :对方的集合的属性名称。
                * table        :多对多的关系需要使用中间表,放的是中间表的名称。
         -->
        <set name="roles" table="sys_user_role" cascade="save-update,delete"  >
            <!-- 
                key标签:
                    * column    :当前的对象对应中间表的外键的名称。
             -->
            <key column="user_id"/>
            <!-- 
                many-to-many标签:
                    * class        :对方的类的全路径
                    * column    :对方的对象在中间表中的外键的名称。
             -->
            <many-to-many class="com.work.entity.Role" column="role_id"/>
        </set>
    </class>
</hibernate-mapping>

 LinkMan.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>
    <class name="com.work.entity.Role" table="sys_role">
        <!-- 建立OID与主键的映射 -->
        <id name="role_id" column="role_id">
            <generator class="native"/>
        </id>
        <!-- 建立普通属性与字段的映射 -->
        <property name="role_name" column="role_name"/>
        <property name="role_memo" column="role_memo"/>
        <!-- 与用户的多对多的映射关系 -->
        <!-- 
            set标签
                * name        :对方的集合的属性名称。
                * table        :多对多的关系需要使用中间表,放的是中间表的名称。
         -->
        <set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
            <!-- 
                key标签:
                    * column    :当前的对象对应中间表的外键的名称。
             -->
            <key column="role_id"/>
            <!-- 
                many-to-many标签:
                    * class        :对方的类的全路径
                    * column    :对方的对象在中间表中的外键的名称。
             -->
            <many-to-many class="com.work.entity.User" column="user_id"/>
        </set>
    </class>
</hibernate-mapping>

 3.多对多的级联操作

1>保存多个用户,每个用户有多个角色

必须有一方放弃主键的维护,一般都是被动的一方放弃

 /**
     * 多对多的级联保存
     */
    @Test
    public void save() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        User user1 = new User();
        User user2 = new User();

        user1.setUser_name("lq");
        user2.setUser_name("xj");

        Role role1 = new Role();
        Role role2 = new Role();
        Role role3 = new Role();

        role1.setRole_name("开发部");
        role2.setRole_name("研发部");
        role3.setRole_name("传销部");

        user1.getRoles().add(role1);
        user1.getRoles().add(role2);

        user2.getRoles().add(role2);
        user2.getRoles().add(role3);

        session.save(user1);
        session.save(user2);

        tx.commit();

    }

 2>通过级联操作只需要对一方进行更新

保存级联操作:保存客户客户对应的联系人也保存了

    /**
     * 多对多的级联更新
     */
    @Test
    public void update() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        User user = session.get(User.class, 11L);
        Role role = session.get(Role.class, 11L);

        //不需要跟新hibernate持久化状态的数据会自动更新到数据库
        user.getRoles().add(role);

        tx.commit();

    }

 删除级联操作:删除用户用户对应的角色也删除了,而且角色对应的用户也会被删除(级联删除是不会使用的)

 /**
     * 多对多的级联删除
     */
    @Test
    public void delete() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        User user = session.get(User.class, 9L);
        session.delete(user);

        tx.commit();

    }

 3>更新级联操作

@Test
    public void update() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        //进行级联更新
        Customer customer = session.get(Customer.class, 3L);
        LinkMan linkMan = session.get(LinkMan.class, 5l);

        //关联
        customer.getLinkMans().add(linkMan);
        linkMan.setCustomer(customer);
session.update(customer); tx.commit(); }
posted on 2019-12-19 11:18  忆夏KhaZix  阅读(124)  评论(0编辑  收藏  举报