Hibernate-----多对多关联映射(映射文件)

多对多可通过两个多对一实现(把第三张表抽取出一个实体,然后两个多对应一个新实体)

多对多会建立三张表,第三张表存放两个外键分别指向两个多;然后两个外键作为第三张表的联合主键

一、单向关联映射

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
       <class name="User"table="t_user">
       <id name="id">
           <generator class="increment"/>
       </id>

       <property name="name"/>

        <!--  维护关系 -->
        <!-- table:指定第三张表的表名 -->
       <set name="roles"table="t_user_role">
           <!—在‘多’的一端(第三张表)添加外键(user_id)指本端 -->
           <key column="user_id"></key>
             <!—- 在多的一端(第三张表)添加外键(role_id)指向关系端 -->
           <many-to-many class="org.app.model.Role" column="role_id" />
       </set>
    </class>
</hibernate-mapping>

To

Many(非维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="Role" table="t_role">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>
    </class>
</hibernate-mapping>
public void testManyToMany() {
       Session session = null;
       try {
           session = HibernateUtils.getSession();
           session.beginTransaction();

            // 先保存非维护端
           Role role1 = new Role();
           role1.setName("role1");
           session.save(role1);

           Role role2 = new Role();
           role2.setName("role2");
           session.save(role2);

           Role role3 = new Role();
           role3.setName("role3");
           session.save(role3);

           Role role4 = new Role();
           role4.setName("role4");
           session.save(role4);

           // 再保存维护端
           User u1 = new User();
           u1.setName("name1");
           Set<Role> u1Roles = new HashSet<Role>();
           u1Roles.add(role1);
           u1Roles.add(role2);
           u1.setRoles(u1Roles);
           session.save(u1);

           User u2 = new User();
           u2.setName("name2");
           Set<Role> u2Roles = new HashSet<Role>();
           u2Roles.add(role1);
           u2Roles.add(role2);
           u2Roles.add(role3);
           u2.setRoles(u2Roles);
           session.save(u2);

           User u3 = new User();
           u3.setName("u3");
           Set<Role> u3Roles = new HashSet<Role>();
           u3Roles.add(role3);
           u3Roles.add(role4);
           u3.setRoles(u3Roles);
           session.save(u3);

           session.getTransaction().commit();
       } catch (Exception e) {
           e.printStackTrace();
           session.getTransaction().rollback();
       } finally {
           HibernateUtils.closeSession(session);
       }
    }

二、双向关联映射

可在任意一端使用reverse属性反转让只让另一端作为维护端

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="User" table="t_user">
       <id name="id">
           <generator class="increment"/>
       </id>

       <property name="name"/>

       <set name="roles"table="t_user_role">
           <key column="user_id"></key>
           <many-to-many class="org.app.model.Role" column="role_id" />
       </set>
    </class>
</hibernate-mapping>

To

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="Role" table="t_role">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>

       <set name="users"table="t_user_role">
             <!—在‘多’的一端(第三张表)添加外键(role_id)指向本端-->
           <key column="role_id"/>
             <!—维护关系:在‘多’的一端(第三张表)添加外键(user_id)指向关系端-->
           <many-to-many class="org.app.model.User" column="user_id" />
       </set>
    </class>
</hibernate-mapping>
时间: 2024-10-10 06:09:28

Hibernate-----多对多关联映射(映射文件)的相关文章

hibernate多对一关联映射

hibernate多对一关联映射: 实体类 (POJO) public class Student{ private int stuId; private String stuNum; private String stuName; private ClassRoom cr; } public class ClassRoom{ private int claId; private String claName; } 映射文件 <class name=" Student" tabl

atitit.atitit.hb many2one relate hibernate 多对一关联配置..

atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. @targetEntity注解 2 2. 生成的sql LEFT OUTER 2 3. 多对一也可以通过关联表的方式来映射,通过 @JoinTable 注解可 2 4. 另外一个属性也关联到table column(recomn?? ) 3 5. 参考 3 1. 多对一单向 @ManyToOne (

05.Hibernate多对多关联

前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teacher)来说明多对多映射关系,一个学生有多个老师,一个老师也有多个学生,其数据库模型图如下: 根据以上图,对应的建表语句如下: CREATE TABLE tb_student ( id bigint NOT NULL auto_increment COMMENT 'ID', no varchar(10) NOT N

hibernate多对一关联映射两种形式的理解

关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 多对一单向和多对一双向关联: 单向:多对一单向是只用维护多的一方,例如一家厂商(Factory)可以生产多种产品(Product),只用在Product实体类和配置文件中配置即可.在Product实体属性类中,需要有Factory属性,而不再需要外键这个属性,因为关联外键的配置在配置文件中many-to-one. 双向:多对一双向关联需要双方都维护对方,例如班级(Class)和学生(Student)之间的关系,需要在Class实体类和

hibernate多对多双向关系映射的级联配置

多对多关系映射 set元素的属性:cascade:级联操作.取值:save-update:级联保存更新delete:级联删除. 注意:在多对多双向关系映射中,不能配置双向级联删除.但是可以配置双向级联保存更新. <set name="roles" table="sys_user_role" cascade="save-update,delete"><key column="user_id"></k

hibernate多对多关联

多对多表的搭建 java类中 多对多 1.关系操作 1.多对多,谁操作效率都一样 2.解除关系 把第三张表的一行数据删除掉 3.建立关系 把第三张表的数据增加一行记录 4.变更关系 先删除后增加 2.级联操作 都是对象针对集合的操作 例子 工具类 public class HibernateUtils {     public static SessionFactory sessionFactory;     public static String url;     @Before     p

Hibernate 多对一关联查询

一.单向多对一和双向多对一的区别 如果只需要从一方获取另一方数据,就用单向多对一:如果需要从双方都获取对方数据,就用双向多对一. 如果有两个对象,一个为User对象,一个为Department对象,一个用户只能属于一个部门,而一个部门可以包含多个用户.这样就是多对一关系.如下图 假设:我们需要通过用户找到所对应的部门,不需要通过部门查询该部门有哪些用户,就采用单向多对一关系 如果:我们不仅需要通过用户获取所对应的部门,还需要通过部门对象获取该部门下的用户,那么就采用双向多对一 二.单向多对一关系

Hibernate 多对多关联Demo

以学生[Student ]与课程[Course ]之间的关系为例: 1 //Course .java 2 3 public class Course implements Serializable { 4 private long cid; 5 private String cname; 6 private String cdesc; 7 private Set<Student> students; 8 //get与set 9 } //Student.java1 public class St

hibernate多对多关联配置文件写法

CmsUserEntry Set<CmsRoleEntry> roles=new CmsRoleEntry(); public void getroles(){ Return roles; } Public void setroles(Set<CmsRoleEntry> cmsRoleEntrys){ thisNaNsRoleEntrys=cmsRoleEntrys; } CmsRoleEntry Set<CmsUserEntry> users=new CmsUserE

Hibernate 多对多关联查询条件使用

from Brand as b inner join fetch b.styles as s where s.styleId=?