`
esffor
  • 浏览: 1367474 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

较为复杂的 Hibernate 数据映射

阅读更多

原文请见:http://www-128.ibm.com/developerworks/cn/java/l-hibernate2/ 。

这里我对它做了点点优化。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通过`@ManyToMany`注解处理这种关系,并通常需要一个中间表来存储双方的连接信息。`@JoinTable`注解用于定义中间表,包括其...

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

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

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

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

    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连表查询

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

    hibernate_reference使用指南全

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

    Hibernate 中文手册 3.1.2.pdf

    1. 配置和管理较为复杂,特别是对于大型项目而言。 2. 有时候会产生比直接使用 JDBC 更多的 SQL 语句,从而影响性能。 3. 对于特定数据库的优化方面可能不如原生 SQL 语句那么灵活。 Hibernate 3.1.2 版本是 ...

    自己编写仿hibernate的java框架

    5. **缓存机制**:虽然可能较为复杂,但可以尝试实现一级缓存(Session级别的缓存)和二级缓存,以优化性能。 6. **事务管理**:理解并实现事务的ACID特性,包括原子性、一致性、隔离性和持久性,这是保证数据完整...

    IBatisVSHibernate

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

    webwork2.1.7+spring+hibernate+oracle整合

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

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

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

    Hibernate笔记

    - **Hibernate的作用**:主要用于处理后台DAO部分的代码,可以将复杂的数据库操作封装起来,使开发人员能够更方便地进行数据的增删改查等操作。 - **ORMapping**(对象关系映射):这是一种编程技术,用于将对象模型...

    Hibernate的char问题.txt

    在给定的文件“Hibernate的char问题.txt”中,虽然描述较为模糊,但我们可以根据提供的 SQL 语句推测出,这里讨论的是在使用 Hibernate 进行数据查询时,如何正确地处理 `char` 类型的数据字段。 #### 三、问题分析...

    ibatis和hibernate配置以及比较

    但若需考虑缓存,两者都有各自的局限,且管理起来较为复杂。 5. 数据库支持:iBatis对不同数据库的支持不如Hibernate全面,如果项目需要跨数据库平台,Hibernate可能更适合。 6. 功能完备性:Hibernate提供了丰富...

    JDBC与Hibernate的比较

    **Hibernate**则是一种ORM(Object Relational Mapping,对象关系映射)框架,它简化了数据持久化层的复杂性,提供了比JDBC更为高级的功能,如缓存机制、事务管理以及对象关系映射等。通过使用Hibernate,开发者可以...

    hibernate教学(student)

    CMP 方式减少了代码量,但使用较为复杂,且对 EJB 规范的理解有一定门槛。 3. **JDO**:JDO 提供了一种更面向对象的方式来处理数据库操作,但是其实现不够成熟,性能优化也存在问题。 #### Hibernate 的特点与优势 ...

    Intro to Hibernate TCJUG

    1. **对象-关系映射**:Hibernate 允许开发者以面向对象的方式处理数据库操作,从而简化了数据访问代码。 2. **易于集成**:Hibernate 可以轻松地与 Spring 等其他流行的 Java 框架集成。 3. **性能优化**:...

Global site tag (gtag.js) - Google Analytics