`
zisefeiniao
  • 浏览: 171256 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

hibernate映射 —— 多对多映射

阅读更多
   讲解完一对多映射之后,做了一个简单的项目,其实说简单也不算简单了,以前都是一天做一个模块,感觉还是挺轻松的,但是现在忽然一天要完成2~3个模块,就觉得吃力了,而且是第一次做Hibernate就更觉得吃力了,不过吃力归吃力这些都不是现在逃避问题的理由,就像李兴华老师经常说的,既然都来学习了,就不要把任何话作为借口,自己就一心拼命往前走,而且现在也已经快拼到头了,我觉得挺不错,慢慢忍,我会好的,在网上很多人对技术的理解不一样,但是我就是跟MLDN的思路走,那些整天嚷着的理论我在MLDN一个都没落,都学了,还说理论上,受不了这些人。



§3.3 Hibernate 的多对多关系映射


多对多关系,表的结构为:

两个实体表,还包含一个关系表,关系表为复合主键,如果要在Hibernate中使用多对多关系映射,则关系表必须只包含两个字段,在hibernate中如果生成了多对多关系映射,则中间关系表不会生成实体(即没有对应的pojo类,更没有其映射文件)。



1、建立表


DROP TABLE user_course ;



DROP TABLE user ;



DROP TABLE course ;



CREATE TABLE user (

    userid            varchar(20)              primary key ,

    name              varchar(20)              not null ,

    age               int                  not null ,

    birthday          date                 not null

);



CREATE TABLE course (

    id                int                  primary key auto_increment ,

    title             varchar(50)              not null,

    description          text                 not null,

    course_num        int                  not null

);



CREATE TABLE user_course (

    userid            varchar(20)              ,

    cid               int                  ,

    primary key (userid, cid ),

    foreign key (userid) references user (userid) on delete cascade ,

    foreign key (cid) references course (id) on delete cascade

);








2、生成映射
选择三个表一起生成映射

在选择主键生成方式的那一步需要注意:





然后每个表的主键生成方式,各自独立设置,即点击下一步再设置,对于中间表,不需要选择主键生成方式(参考复合主键映射)。



3、查看pojo类


生成好的pojo包含了多对多关系,而且没有生成中间关系表的映射。





package org.liky.pojo;



import java.util.Date;

import java.util.HashSet;

import java.util.Set;







public class User implements java.io.Serializable {



    // Fields



    private String userid;



    private String name;



    private Integer age;



    private Date birthday;



    private Set courses = new HashSet(0);



    // Constructors



  

    public User() {

    }



  

    public User(String userid, String name, Integer age, Date birthday) {

       this.userid = userid;

       this.name = name;

       this.age = age;

       this.birthday = birthday;

    }



  

    public User(String userid, String name, Integer age, Date birthday,

           Set courses) {

       this.userid = userid;

       this.name = name;

       this.age = age;

       this.birthday = birthday;

       this.courses = courses;

    }



    // Property accessors



    public String getUserid() {

       return this.userid;

    }



    public void setUserid(String userid) {

       this.userid = userid;

    }



    public String getName() {

       return this.name;

    }



    public void setName(String name) {

       this.name = name;

    }



    public Integer getAge() {

       return this.age;

    }



    public void setAge(Integer age) {

       this.age = age;

    }



    public Date getBirthday() {

       return this.birthday;

    }



    public void setBirthday(Date birthday) {

       this.birthday = birthday;

    }



    public Set getCourses() {

       return this.courses;

    }



    public void setCourses(Set courses) {

       this.courses = courses;

    }



}

package org.liky.pojo;



import java.util.HashSet;

import java.util.Set;







public class Course implements java.io.Serializable {



    // Fields



    private Integer id;



    private String title;



    private String description;



    private Integer courseNum;



    private Set users = new HashSet(0);



    // Constructors



  

    public Course() {

    }



  

    public Course(String title, String description, Integer courseNum) {

       this.title = title;

       this.description = description;

       this.courseNum = courseNum;

    }



  

    public Course(String title, String description, Integer courseNum, Set users) {

       this.title = title;

       this.description = description;

       this.courseNum = courseNum;

       this.users = users;

    }



    // Property accessors



    public Integer getId() {

       return this.id;

    }



    public void setId(Integer id) {

       this.id = id;

    }



    public String getTitle() {

       return this.title;

    }



    public void setTitle(String title) {

       this.title = title;

    }



    public String getDescription() {

       return this.description;

    }



    public void setDescription(String description) {

       this.description = description;

    }



    public Integer getCourseNum() {

       return this.courseNum;

    }



    public void setCourseNum(Integer courseNum) {

       this.courseNum = courseNum;

    }



    public Set getUsers() {

       return this.users;

    }



    public void setUsers(Set users) {

       this.users = users;

    }



}



















































































4、查看并修改映射文件
重点注意 inverse和cascade



<?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">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="org.liky.pojo.User" table="user" catalog="testdb">

        <id name="userid" type="java.lang.String">

            <column name="userid" length="20" />

            <generator class="assigned"></generator>

        </id>

        <property name="name" type="java.lang.String">

            <column name="name" length="20" not-null="true" />

        </property>

        <property name="age" type="java.lang.Integer">

            <column name="age" not-null="true" />

        </property>

        <property name="birthday" type="java.util.Date">

            <column name="birthday" length="10" not-null="true" />

        </property>

        <!-- 与Course中的多对多关系配置相同,只是没有inverse=true的配置,表示由该类进行中间表操作。 -->

        <set name="courses" table="user_course" catalog="testdb">

            <key>

                <column name="userid" length="20" not-null="true" />

            </key>

            <many-to-many entity-name="org.liky.pojo.Course">

                <column name="cid" not-null="true" />

            </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://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="org.liky.pojo.Course" table="course" catalog="testdb">

        <id name="id" type="java.lang.Integer">

            <column name="id" />

            <generator class="native"></generator>

        </id>

        <property name="title" type="java.lang.String">

            <column name="title" length="50" not-null="true" />

        </property>

        <property name="description" type="java.lang.String">

            <column name="description" length="65535" not-null="true" />

        </property>

        <property name="courseNum" type="java.lang.Integer">

            <column name="course_num" not-null="true" />

        </property>

        <!--

        inverse="true"表示关系交给对方进行控制。

        包含在Course类中表示关系由User类进行控制,也就是说,对User类进行操作时,会同时影响中间表的数据。

        这里说的操作为(session.save()/update()/delete())

      

        如果在这里加入了cascade,表示进行save()/update()/delete()操作时影响对方对象

        在这里就是User类,不要与inverse混淆

      

        table属性在这里表示两者关系维护的中间表

      

         -->

        <set name="users" inverse="true" table="user_course" catalog="testdb">

            <key>

              <!-- 表示中间表中的cid与当前Course中的主键值对应 -->

                <column name="cid" not-null="true" />

            </key>

            <!-- 多对多关系映射,表示与User类有该关系映射 -->

            <many-to-many entity-name="org.liky.pojo.User">

              <!--  User类中的主键值与中间表的userid有对应关系 -->

                <column name="userid" length="20" not-null="true" />

            </many-to-many>

        </set>

    </class>

</hibernate-mapping>








5、完成DAO代码


6、测试选课和插入功能


       UserDAO userdao = DAOFactory.getUserDAOInstance();

       CourseDAO coursedao = DAOFactory.getCourseDAOInstance();



       // 插入

       // User user = new User();

       // user.setUserid("Liky");

       // user.setName("MLDN");

       // user.setAge(21);

       // user.setBirthday(new Date());

       //

       // try {

       // userdao.doCreate(user);

       // } catch (Exception e) {

       // // TODO Auto-generated catch block

       // e.printStackTrace();

       // }

       //

       // Course c = new Course();

       // c.setTitle("Hibernate基础");

       // c.setDescription("框架基础(2)");

       // c.setCourseNum(20);

       //

       // try {

       // coursedao.doCreate(c);

       // } catch (Exception e) {

       // // TODO Auto-generated catch block

       // e.printStackTrace();

       //     }



       // 处理选课

        try {

           User user = userdao.findById("Liky");

           // 先删除中间表的数据

           user.setCourses(new HashSet());



           // 取得课程数组

           int[] cids = {1,2,3};

         

           // 处理关系

           for (int i = 0; i < cids.length;i++) {

              Course c = new Course();

              c.setId(cids[i]);

              user.getCourses().add(c);

           }

           // 调用修改方法

           userdao.doUpdate(user);

         



       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }




插入数据时,不会使用cascade插入对方数据

选课需要使用user的update方法进行处理,注意先清空原有课程,再加入新课程。


分享到:
评论
1 楼 scwwc55555 2010-09-25  
     

相关推荐

    hibernate映射和查询

    **hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...

    Hibernate使用——入门

    - **多对多**:`@ManyToMany`处理多对多关系,需要中间表,可通过`@JoinTable`定义。 **学习资源推荐** - Hibernate官方文档:https://hibernate.org/orm/documentation/ - Hibernate教程:...

    Hibernate总结——课程管理

    本教程将深入探讨如何使用Hibernate来实现一个简单的课程管理系统,涵盖多对多关联映射以及CRUD操作。 ### Hibernate概述 Hibernate是一个开源的ORM框架,它允许开发者使用Java对象来表示数据库中的记录,从而避免...

    Hibernate映射配置实例大全(详细总结)

    "Hibernate映射配置实例大全"是一个全面深入的资源,旨在帮助开发者理解和掌握如何有效地配置Hibernate以实现对象关系映射(ORM)。在这个文档中,我们将探讨各种关键的映射配置方法,以及相关的实例。 首先,我们...

    Hibernate 4——Hello World

    通过将Java对象与数据库表之间的映射关系进行抽象,Hibernate允许开发者用面向对象的方式处理数据,从而减少了对SQL的直接依赖。 ### Hibernate 4简介 Hibernate 4是Hibernate框架的一个重要版本,它带来了许多改进...

    Hibernate使用——自定义数据类型

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。在实际项目开发中,有时我们可能需要对数据库中的某些字段使用自定义的...

    hibernate映射

    ### Hibernate映射——连接对象世界与数据库的桥梁 Hibernate是一种流行的Java持久层框架,其核心功能是提供一个高级的对象关系映射(ORM)工具,用于将Java对象模型映射到传统的关系型数据库上。在开发基于Java的...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    本压缩包文件“Hibernate映射解析 七种映射关系 后端 - Java.zip”中详细介绍了Hibernate的核心概念——映射关系。以下是关于Hibernate映射关系的详细解释: 1. **一对一映射** (One-to-One Mapping) 在一对一映射...

    hibernate 映射模板

    在本篇文章中,我们将深入探讨Hibernate映射模板及其相关知识点。 首先,我们要理解的是Hibernate的核心概念——对象关系映射。ORM允许开发者用面向对象的方式来处理数据库,避免了直接编写SQL语句,提高了代码的...

    商城数据库hibernate映射实例

    例如,用户和订单是一对多关系,订单和订单项是一对多关系,订单项和商品是多对一关系。这些关系需要在映射文件中明确指定,例如使用`&lt;set&gt;`、`&lt;one-to-many&gt;`和`&lt;many-to-one&gt;`标签。 6. **查询语言(HQL)**:...

    Hibernate映射配置详解

    在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...

    Hibernate映射关系配置:XML方式和注解方式

    标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...

    Hibernate映射

    【标题】:“Hibernate映射” 在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,将Java类与数据库表之间的关系进行了抽象,使得开发者可以像操作对象一样操作数据库。...

    Hibernate教程09_关系映射之组件映射

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射中的组件映射。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它允许开发人员以面向对象的方式处理数据库操作,极大地简化了数据层...

    hibernate 映射继承 demo

    《Hibernate映射继承实战解析》 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式处理数据,而无需关心底层SQL语句的编写。在大型项目中,...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...

    HIbernate映射实例

    【标题】"HIbernate映射实例"涉及的是Java持久化框架Hibernate的核心概念——对象关系映射(ORM)。Hibernate作为一款强大的ORM工具,允许开发者用面向对象的方式处理数据库操作,从而降低了数据库编程的复杂性。 ...

    Hibernate教程13_关系映射之多对多单向关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是多对多单向关联。在数据库设计中,多对多关系是两个实体之间最复杂的关系类型,允许一个实体实例与多个其他实体实例相关联,反之亦然。在...

    深入浅出Hibernate中文版 part1

    第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...

Global site tag (gtag.js) - Google Analytics