`
ninebirds
  • 浏览: 79651 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

较为复杂的Hibernate 数据映射

阅读更多

Hibernate 在一对一的时候,只需要 Save 主对象就可以保存从对象;在一对多的时候,通过反转(inverse="ture")也只需要 Save 主对象来保存从对象;在多对多的时候,则主从对象都得保存。

对于 Student-Address,可以通过保存 Student 来保存 Address;
对于 Student-Course,既要保存 Student,也要保存 Course;
对于 Classes-Student,可以通过保存 Classes 来保存 Student。

相应的我们需要在映射文件中指定主对象等:

Student.hbm.xml 中于三个对象的设置:
      <set name="courses"
            table="Student_Course_Link"
            lazy="false"
            inverse="true"
            cascade="all"
            sort="unsorted">

            <key column="StudentId"/>
            <many-to-many
                  class="com.ivan.hibernate.Course"
                  column="CourseId"
                  outer-join="auto"/>
      </set>
     
      <many-to-one
            name="classes"
            class="com.ivan.hibernate.Classes"
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="ClassesId"/>
     
      <one-to-one
            name="address"
            class="com.ivan.hibernate.Address"
            cascade="all"
            outer-join="auto"
            constrained="false"/>

Classes.hbm.xml 中与 Student 的设定:
      <set name="students"
            table="Students"
            lazy="false"
            inverse="true"
            cascade="all"
            sort="unsorted">
      <key  column="ClassesId"/>
      <one-to-many class="com.ivan.hibernate.Student"/>
    </set>

Course.hbm.xml 中与 Student 的设定:
      <set  name="students"
            table="Student_Course_Link"
            lazy="false"
            inverse="false"
            cascade="all"
            sort="unsorted">
        <key column="CourseId"/>
        <many-to-many class="com.ivan.hibernate.Student"
                  column="StudentId"
                  outer-join="auto"/>
      </set>

Address.hbm.xml 中:
       <id
            name="id"
            column="AddressId"
            type="string"
            unsaved-value="any">
            <generator class="foreign">
                <param name="property">student</param>
            </generator>
        </id>

      <one-to-one name="student"
                    class="com.ivan.hibernate.Student"
                    constrained="true"/>

Classes.java、Student.java、Course.java  文件中的属性是 Set 类型的,请先初始化 new HashSet()。

这样,原有的 TestServelet.java 中的

Student jake = new Student();
jake.setName("jake");
jake.setId("008");
 
Address addr=new Address();
addr.setCity("beijing");
addr.setState("bj");
addr.setStreet("tsinghua");
addr.setZip("100083");
addr.setId(jake.getId());

jake.setAddress(addr);

Set set=new HashSet();
set.add(jake);
Course course=new Course();
course.setId("218");
course.setName("computer_jsp");
course.setStudents(set);

Classes cl=new Classes();
cl.setId("238");
cl.setName("pro computer");
cl.setStudents(set);

jake.setClasses(cl);
……
session.save(addr);
session.save(cl);
session.save(course);
session.save(jake);

可以更改为:
Student jake = new Student();
jake.setName("jake");
jake.setId("008");
       
Address addr=new Address();
addr.setCity("beijing");
addr.setState("bj");
addr.setStreet("tsinghua");
addr.setZip("100083");
addr.setId(jake.getId()); 

jake.setAddress(addr);    
addr.setStudent(jake);

Course course=new Course();
course.setId("218");
course.setName("computer_jsp");

course.getStudents().add(jake);
jake.getCourses().add(course);
      
Classes cl=new Classes();
cl.setId("238");
cl.setName("pro computer");

jake.setClasses(cl);
cl.getStudents().add(jake);
……  
session.save(cl);
session.save(course);

通过设置 hibernate.cfg.xml 中的 <property name="show_sql">true</property> 可以看到更改后的执行的 SQL 语句比更改前少,执行效率更高。

分享到:
评论

相关推荐

    配置hibernate数据源

    配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...

    hibernate的关联映射

    多对多关联较为复杂,如学生和课程的关系,一个学生可以选修多门课程,反之亦然。Hibernate通过`@ManyToMany`注解处理这种关系,并通常需要一个中间表来存储双方的连接信息。`@JoinTable`注解用于定义中间表,包括其...

    hibernate数据持久化组件

    ### Hibernate 数据持久化组件 #### 一、背景与概述 在现代软件开发中,数据持久化是一项关键的技术,它解决了程序运行过程中数据的保存问题。根据题目提供的信息,“内存是暂时存储设备,断电后数据易丢失”,这...

    Hibernate_实体关联关系映射--学习总结

    Hibernate的实体关联映射是其核心功能之一,它通过灵活的配置来适应不同场景下的数据持久化需求。通过对一对一、一对多、多对多等映射关系的熟练掌握和灵活运用,可以有效地处理复杂的实体关系,提高开发效率和应用...

    Hibernate(23):一个较为复杂些的例子

    在这个“Hibernate(23):一个较为复杂些的例子”中,我们将深入探讨如何在实际项目中运用Hibernate处理更为复杂的业务场景。通过访问博文链接,你可以找到更详细的步骤和解释。 首先,让我们了解ORM的基本概念。ORM...

    HIbernate关系映射

    多对多关联是一种较为复杂的关系类型,通常需要通过中间表来维护两个实体类之间的关联。在选课系统中,一个学生可以选修多个课程,而一个课程也可以被多个学生选修。 **配置文件** (`Student.hbm.xml`): ```xml ...

    Hibernate中List信息的配置

    Map在Hibernate中的映射较为复杂,涉及`&lt;map&gt;`、`&lt;key&gt;`、`&lt;index&gt;`和`&lt;element&gt;`等多个标签。`&lt;key&gt;`标签用于定义Map的主键,`&lt;index&gt;`和`&lt;element&gt;`则分别用于定义Map的键和值。Map映射在处理具有复杂关联的数据...

    Hibernate配置数据连接

    ### Hibernate配置数据连接详解 #### 一、概述 在Java持久化框架中,Hibernate是非常流行的ORM(对象关系映射)工具之一。为了更好地管理和优化数据库连接资源,Hibernate支持多种连接池技术,例如c3p0和Proxool等...

    hibernate_reference使用指南全

    介绍如何使用 Hibernate 的动态元数据映射来处理结构不确定的数据。 - **4.5 Tuplizer** Tuplizer 是 Hibernate 中用于将 ResultSet 转换为 Java 对象的组件,它提供了更多的灵活性和控制能力。 #### 七、基本...

    Hibernate连表查询 Hibernate连表查询

    这种方式适用于那些较为复杂的SQL查询,尤其是在HQL无法满足需求的情况下。 ### 查询结果处理 对于连表查询的结果处理,通常有两种常见的方式: #### 1. 获取单个字段值 如果只需要查询结果中的一个或几个字段,...

    Hibernate4

    - 也是较为知名的 ORM 框架,但在 Java 社区中的使用频率低于 Hibernate 和 MyBatis。 #### 五、Hibernate 与 JDBC 的比较 - **Hibernate 实现**: - 通过安装 Hibernate 插件,例如 hibernatetools-4.1.1.Final...

    Hibernate 中文手册 3.1.2.pdf

    Hibernate 是一个开源的对象关系映射 (ORM) 工具,它极大地简化了 Java 应用程序中数据的持久化操作。对象关系映射是一种编程技术,用于在关系数据库和对象之间建立一个桥梁,使得开发者可以使用面向对象的方式来...

    hibernate基础 入门/ hibernate basic

    **Hibernate** 是一款开源的对象关系映射框架,它允许开发者以透明的方式处理持久化POJO(Plain Old Java Object)。Hibernate的核心优势在于它能够自动处理对象与关系型数据库之间的映射,极大地减轻了开发者的负担...

    hibernate 开发工具包

    在给定的“hibernate 开发工具包”中,包含的是Hibernate 3.3.2版本的jar包,这是一个相对较为早期但仍然被一些项目使用的版本。以下是关于Hibernate 3.3.2及其关键特性的详细解释: 1. **对象关系映射(ORM)**:...

    自己编写仿hibernate的java框架

    在IT行业中,Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本项目旨在模仿Hibernate的核心功能,以加深对ORM的理解并锻炼Java编程能力...

    IBatisVSHibernate

    2. **学习曲线**:Hibernate的学习曲线相对较陡,因为它涉及的对象关系映射和查询语言较为复杂;而IBatis相对简单,更易于理解和上手。 3. **性能**:由于Hibernate的自动对象管理,可能会产生额外的数据库交互,...

    Hibernate的多对一和一对多操作实例

    总之,Hibernate的多对一和一对多操作不仅提供了灵活的关联管理,还允许开发者将复杂的数据关系逻辑封装在应用程序中,从而简化数据库设计,提高代码的可读性和可维护性。然而,这也要求开发者对Hibernate的映射机制...

    webwork2.1.7+spring+hibernate+oracle整合

    WebWork 2.1.7版本是一个较为成熟的版本,提供了一系列功能强大的特性,如请求映射、类型转换、数据验证、国际化等,使得开发者能够更专注于业务逻辑而非框架细节。通过使用`webwork2.1.7.jar`、`xwork.jar`、`os...

Global site tag (gtag.js) - Google Analytics