hibernare多对多关系映射

来源:互联网 发布:mac文档在哪里 编辑:程序博客网 时间:2024/05/29 12:24

多对多表设计2张表需要在多创建出来一张来维护两张表的关系

  • 表中的关系
Created with Raphaël 2.1.0useruseruser_roleuser_rolerolerole员工到中间表角色到中间表user_role表用外键来维护两张表的关系
  • 创建实体
    • 用户实体(user)
package cn.xiaolong.domian;import java.util.HashSet;import java.util.Set;public class User {    private Long user_uid;    private String user_name;    // 所有角色的集合    private Set<Role> role = new HashSet<Role>();    public Set<Role> getRole() {        return role;    }    public void setRole(Set<Role> role) {        this.role = role;    }    public Long getUser_uid() {        return user_uid;    }    public void setUser_uid(Long user_uid) {        this.user_uid = user_uid;    }    public String getUser_name() {        return user_name;    }    public void setUser_name(String user_name) {        this.user_name = user_name;    }}
  • 角色实体(role)
package cn.xiaolong.domian;import java.util.Set;public class Role {    private Long role_id;    private String role_name;    //所有用户角色的集合    private Set<User> user = new HashSet<User>();    public Set<User> getUser() {        return user;    }    public void setUser(Set<User> user) {        this.user = 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;    }}
  • 创建映射
    • user的orm映射文件(user.hbm.xml)
    • user表中使用了级联操作 role表就要放弃维护,负责会多生成一张中间表(表中还是没有数据的)
<?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.xiaolong.domian">    <class name="User">        <id name="user_uid">            <generator class="native"></generator>        </id>        <property name="user_name"></property>        <!--set标签: name元素:关联的另一方的集合的属性名称 table元素:中间表名称  cascade属性:级联操作 -->        <set name="role" table="user_role" cascade="save-update">            <!--key标签: columu元素:当前对象在中间表在的外键名称 -->            <key column="user_id"></key>            <!--many-to-many标签: columu元素:关联另一方在中间表的名称 class元素:关联另一方的类的全路径 -->            <many-to-many column="role_id" class="cn.xiaolong.domian.Role">            </many-to-many>        </set>    </class></hibernate-mapping>
  • role的orm映射文件(role.hbm.xml)
    • inverse元素:放弃维护 (上面user表使用级联操作在对应的表中必须放弃维护要不数据库里就会生成2张中间表, role不维护关系就不会生成表了)
<?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.xiaolong.domian">    <class name="Role" table="role">        <id name="role_id">            <generator class="nativa"></generator>        </id>        <property name="role_name"></property>        <!--set标签: name元素:关联的另一方的集合的属性名称 table元素:中间表名称 inverse元素:放弃维护 上面user表使用级联操作在对应的表中必须放弃维护要不数据库里就会生成2张中间表,role不维护关系就不会生成表了) -->        <set name="user"table="user_role" inverse="true">            <!--key标签: columu元素:当前对象在中间表在的外键名称 -->            <key column="role_id" />            <!--many-to-many标签: columu元素:关联另一方在中间表的名称 class元素:关联另一方的类的全路径 -->            <many-to-many column="user_id" class="cn.xiaolong.domian.User"></many-to-many>        </set>    </class></hibernate-mapping>
  • 在核心配置文件中加入映射文件
  • hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_crm</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">123</property>        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        <property name="hibernate.show_sql">true</property>        <property name="hibernate.format_sql">true</property>        <!-- 表生产策略 -->        <property name="hibernate.hbm2ddl.auto">update</property>        <!-- 指定hibernate操作数据库时的隔离级别         <property name="hibernate.connection.isolation">4</property>        <!-- 指定session与当前线程绑定 -->        <property name="hibernate.current_session_context_class">thread</property>        <!-- 引入orm元数据 路径写src下的 -->        <mapping resource="cn/xiaolong/domian/role.hbm.xml" />        <mapping resource="cn/xiaolong/domian/user.hbm.xml" />    </session-factory></hibernate-configuration>

这两句是关键

<!-- 引入orm元数据 路径写src下的 -->        <mapping resource="cn/xiaolong/domian/role.hbm.xml" />        <mapping resource="cn/xiaolong/domian/user.hbm.xml" />
  • 代码测试
@Test    public void demo(){        Session session = HibernateUtils.getCurrentSession();        Transaction tx = session.beginTransaction();        //创建user        User user1 = new User();        user1.setUser_name("张三");        User user2 = new User();        user2.setUser_name("李四");        //创建角色        Role role1 = new Role();        role1.setRole_name("程序员");        Role role2 = new Role();        role2.setRole_name("产品");        //user维护关系        user1.getRole().add(role1);        user2.getRole().add(role2);        session.save(user1);        session.save(user2);        tx.commit();    }
原创粉丝点击