十一、Hiberante多对多关联关系(双向)

一、Hibernate多对多关联关系(双向)

(1)实体类与表间的关系

User            Role           t_user    t_user_role    t_role

int:id          id:int         id          id           id

name:String     name:String    name        userid       name

roles:set       users:Set                  roleid

 

(2)、创建表语句

CREATE TABLE `t_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `tab_user` (`id`,`name`) VALUES
 (1,'admin'),
 (2,'test'),
 (3,'newsManger');

CREATE TABLE `t_user_role` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL,
  `roleid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `t_user_role` (`id`,`userid`,`roleid`) VALUES
 (1,1,1),
 (2,1,2),
 (3,1,3),
 (4,3,2),
 (5,2,2),
 (6,2,3);

CREATE TABLE `t_role` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `rname` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `t_role` (`id`,`ename`) VALUES
 (1,'系统管理员'),
 (2,'新闻管理员'),
 (3,'广告管理员');

 

(3)、创建实体类与映射文件

User.java

public class User {
    private int id;
    private String name;
    private Set roles;
   
    public User(){
       
    }

     省略set、get方法

}

Role.java

public class Role {
    private int id;
    private String name;
    private Set users;
    public Role(){
       
    }

     省略set、get方法

}

User.hbm.xml

<hibernate-mapping>
    <class name="com.keli.pojo.User" table="t_user">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="roles" table="t_user_role">
            <key column="userid"/>
            <many-to-many class="com.keli.pojo.Role" column="roleid"/>
        </set>
    </class>
</hibernate-mapping>

Role.hbm.xml

<hibernate-mapping>
    <class name="com.keli.pojo.Role" table="t_role">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="users" table="t_user_role" order-by="userid">
            <key column="roleid"/>
            <many-to-many class="com.keli.pojo.User" column="userid"/>
        </set>
    </class>
</hibernate-mapping>

 

(4)、测试

public class TestMany2Many2 extends TestCase {
    public void testSave1(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
            Role r1 = new Role();
            r1.setName("数据录入人员");
            session.save(r1);
           
            Role r2 = new Role();
            r2.setName("商务主管");
            session.save(r2);
           
            Role2 r3 = new Role2();
            r3.setName("大区经理");
            session.save(r3);
           
            User u1 = new User();
            u1.setName("菜10");
            Set u1Roles = new HashSet();
            u1Roles.add(r1);
            u1Roles.add(r2);
            u1.setRoles(u1Roles);
           
            User u2 = new User();
            u2.setName("袓儿");
            Set u2Roles = new HashSet();
            u2Roles.add(r2);
            u2Roles.add(r3);
            u2.setRoles(u2Roles);
           
            User u3 = new User();
            u3.setName("杰士棒");
            Set u3Roles = new HashSet();
            u3Roles.add(r1);
            u3Roles.add(r2);
            u3Roles.add(r3);
            u3.setRoles(u3Roles);
           
            session.save(u1);
            session.save(u2);
            session.save(u3);
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
   
    public void testLoad1(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
            User user = (User)session.load(User.class, 12);
            System.out.println(user.getName());
            for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
                Role role = (Role)iter.next();
                System.out.println(role.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
   
    public void testLoad2(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
            Role role = (Role)session.load(Role.class, 12);
            System.out.println(role.getName());
            for (Iterator iter=role.getUsers().iterator(); iter.hasNext();) {
                User user = (User)iter.next();
                System.out.println(user.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
}

 

说明:

hibernate多对多关联映射(双向User<---->Role)

映射方法:
        <set name="roles" table="t_user_role">
            <key column="userid"/>
            <many-to-many class="com.keli.pojo.Role" column="roleid"/>
        </set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值