zoukankan      html  css  js  c++  java
  • hibernate 之 关联映射的单向多对多

    1. 在实际开发中,多对多关联比较常见,比如用户和角色,或者是角色和权限。

    角色和权限的关系如图:

    2. 类结构:Permission.java

    public class Permission {
        private int id;
        private String name;
        public Permission() {
            // TODO Auto-generated constructor stub
        }
        
        public Permission(String name) {
            super();
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    Role.java

    public class Role {
        private int id;
        private String name;
        private Set<Permission> permissions=new HashSet<Permission>();
        public Role() {
            // TODO Auto-generated constructor stub
        }
        
        public Role(String name) {
            super();
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Permission> getPermissions() {
            return permissions;
        }
        public void setPermissions(Set<Permission> permissions) {
            this.permissions = permissions;
        }
    }

    3. 映射文件:

    Permission.hbm.xml

    <hibernate-mapping>
        <class name="cn.wh.vo.Permission" table="t_permission">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name"/>
        </class>
    </hibernate-mapping>

    Role.hbm.xml

    <hibernate-mapping package="cn.wh.vo">
        <class name="Role" table="t_role">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name"/>
            <!-- table表示 关联表  这张表由hibernate来创建和维护-->
            <set name="permissions" table="t_role_permission">
                <!-- 当前类在关联表中的外键 -->
                <key column="rid"></key>
                <!-- 表示当前类的关联类在关联表中的外键 -->
                <many-to-many column="pid" class="Permission"/>
            </set>
        </class>
    </hibernate-mapping>

    4. 测试:

    public class HibernateTest {
        private Session session=null;
        @Before
        public void setUp(){
            session = HibernateUtil.getSession();
        }
        @After
        public void tearDown(){
            HibernateUtil.close();
        }
        @Test
        public void testCreateDB(){
            Configuration cfg = new Configuration().configure();
            SchemaExport export = new SchemaExport(cfg);
            //第一个参数  是否打印  数据库脚本
            //第二个参数 是否将脚本导入数据库执行
            export.create(true, true);
        }
        @Test
        public void testInit(){
            Transaction tx = null;
            try {
                tx = session.beginTransaction();
                Role r1 = new Role("管理员");
                Role r2 = new Role("会员");
                Permission p1 = new Permission("系统管理");
                Permission p2 = new Permission("用户管理");
                Permission p3 = new Permission("订单管理");
                Permission p4 = new Permission("商品管理");
                r1.getPermissions().add(p1);
                r1.getPermissions().add(p2);
                r1.getPermissions().add(p3);
                r1.getPermissions().add(p4);
                r2.getPermissions().add(p3);
                r2.getPermissions().add(p4);
                session.save(p1);
                session.save(p2);
                session.save(p3);
                session.save(p4);
                session.save(r1);
                session.save(r2);
                tx.commit();
                
            } catch (Exception e) {
                if(tx!=null)
                    tx.rollback();
            }
        }
        @Test
        public void testGet(){
            Role r = (Role)session.get(Role.class, 1);
            System.out.println(r.getName());
            System.out.println("--------------");
            for(Permission p:r.getPermissions()){
                System.out.println(p.getName());
            }
        }
        }
  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/forever2h/p/6737609.html
Copyright © 2011-2022 走看看