Hibernate的关联关系映射之多对多映射

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011301372/article/details/83188515

JavaBean的编写

public class User {
    private Long userid;
    private String username;
    private String password;

    //编写都是集合
    private Set<Role> roles = new HashSet<Role>();

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

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

    public Long getUserid() {
        return userid;
    }

    public void setUserid(Long userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
public class Role {
    private Long roleid;
    private String rolename;


    private Set<User> users = new HashSet<User>();

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

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

    public Long getRoleid() {
        return roleid;
    }

    public void setRoleid(Long roleid) {
        this.roleid = roleid;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }
}

配置文件(多对多关系中必须有一方放弃对外键的维护)

<?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="zst.cm.domain.User" table="sys_user">
        <id name="userid" column="userid">
            <generator class="native"/>
        </id>
        <property name="username" column="username"/>
        <property name="password" column="password"/>
        <!--配置多对多 name 集合的名称   table 中间表的名称-->
        <set name="roles" table="sys_user_role" inverse="true">
            <!--当前对象在中间表的外键的名称-->
            <key column="uid"/>
            <!-- class集合中存的对象的全路径-->
            <!--column 集合中对象在中间表的外键的名称-->
            <many-to-many class="zst.cm.domain.Role" column="rid"></many-to-many>
        </set>
    </class>

</hibernate-mapping> 
<?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="zst.cm.domain.Role" table="sys_role">
        <id name="roleid" column="roleid">
             <generator class="native"/>
        </id>
        <property name="rolename" column="rolename"/>
        <set name="users" table="sys_user_role">

            <key column="rid"/>
            <many-to-many class="zst.cm.domain.User" column="uid"/>
        </set>

    </class>
</hibernate-mapping> 

测试类

public class Demo2 {
    @Test
    public void run1(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();

        //多对多双向关联
       User u1= new User();
       u1.setUsername("张三");
       User u2 = new User();
       u2.setUsername("李四");

       //创建角色
        Role r1 = new Role();
        r1.setRolename("经理");
        Role r2 = new Role();
        r2.setRolename("演员");

        //关联
        u1.getRoles().add(r1);
        u1.getRoles().add(r2);

        r1.getUsers().add(u1);
        r1.getUsers().add(u2);

        u2.getRoles().add(r1);
        r1.getUsers().add(u2);

        session.save(u1);
        session.save(u2);
        session.save(r1);
        session.save(r2);

        tr.commit();

    }
}

级联保存

<!--User.hbm.xml-->
 <set name="roles" table="sys_user_role" cascade="save-update">
            <!--当前对象在中间表的外键的名称-->
            <key column="uid"/>
            <!-- class集合中存的对象的全路径-->
            <!--column 集合中对象在中间表的外键的名称-->
            <many-to-many class="zst.cm.domain.Role" column="rid"></many-to-many>
 </set>

<!--Role.hbm.xml-->
 <set name="users" table="sys_user_role" inverse="true">

            <key column="rid"/>
            <many-to-many class="zst.cm.domain.User" column="uid"/>
 </set>

测试类

public void run2(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();

        //多对多双向关联
        User u1= new User();
        u1.setUsername("张三");
        User u2 = new User();
        u2.setUsername("李四");

       //创建角色
        Role r1 = new Role();
        r1.setRolename("经理");
        Role r2 = new Role();
        r2.setRolename("演员");
        //关联
        u1.getRoles().add(r1);
        u1.getRoles().add(r2);
        u2.getRoles().add(r1);
        
        session.save(u1);
        session.save(u2);
        
        tr.commit();

    }

级联删除

 public void run3(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();

       User u1 = session.get(User.class,3L);
       Role r2 = session.get(Role.class,3L);
       u1.getRoles().remove(r2);
        tr.commit();

    }

猜你喜欢

转载自blog.csdn.net/u011301372/article/details/83188515