原文请见: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通过`@ManyToMany`注解处理这种关系,并通常需要一个中间表来存储双方的连接信息。`@JoinTable`注解用于定义中间表,包括其...
在这个“Hibernate(23):一个较为复杂些的例子”中,我们将深入探讨如何在实际项目中运用Hibernate处理更为复杂的业务场景。通过访问博文链接,你可以找到更详细的步骤和解释。 首先,让我们了解ORM的基本概念。ORM...
Hibernate的实体关联映射是其核心功能之一,它通过灵活的配置来适应不同场景下的数据持久化需求。通过对一对一、一对多、多对多等映射关系的熟练掌握和灵活运用,可以有效地处理复杂的实体关系,提高开发效率和应用...
多对多关联是一种较为复杂的关系类型,通常需要通过中间表来维护两个实体类之间的关联。在选课系统中,一个学生可以选修多个课程,而一个课程也可以被多个学生选修。 **配置文件** (`Student.hbm.xml`): ```xml ...
Map在Hibernate中的映射较为复杂,涉及`<map>`、`<key>`、`<index>`和`<element>`等多个标签。`<key>`标签用于定义Map的主键,`<index>`和`<element>`则分别用于定义Map的键和值。Map映射在处理具有复杂关联的数据...
这种方式适用于那些较为复杂的SQL查询,尤其是在HQL无法满足需求的情况下。 ### 查询结果处理 对于连表查询的结果处理,通常有两种常见的方式: #### 1. 获取单个字段值 如果只需要查询结果中的一个或几个字段,...
介绍如何使用 Hibernate 的动态元数据映射来处理结构不确定的数据。 - **4.5 Tuplizer** Tuplizer 是 Hibernate 中用于将 ResultSet 转换为 Java 对象的组件,它提供了更多的灵活性和控制能力。 #### 七、基本...
1. 配置和管理较为复杂,特别是对于大型项目而言。 2. 有时候会产生比直接使用 JDBC 更多的 SQL 语句,从而影响性能。 3. 对于特定数据库的优化方面可能不如原生 SQL 语句那么灵活。 Hibernate 3.1.2 版本是 ...
5. **缓存机制**:虽然可能较为复杂,但可以尝试实现一级缓存(Session级别的缓存)和二级缓存,以优化性能。 6. **事务管理**:理解并实现事务的ACID特性,包括原子性、一致性、隔离性和持久性,这是保证数据完整...
2. **学习曲线**:Hibernate的学习曲线相对较陡,因为它涉及的对象关系映射和查询语言较为复杂;而IBatis相对简单,更易于理解和上手。 3. **性能**:由于Hibernate的自动对象管理,可能会产生额外的数据库交互,...
WebWork 2.1.7版本是一个较为成熟的版本,提供了一系列功能强大的特性,如请求映射、类型转换、数据验证、国际化等,使得开发者能够更专注于业务逻辑而非框架细节。通过使用`webwork2.1.7.jar`、`xwork.jar`、`os...
总之,Hibernate的多对一和一对多操作不仅提供了灵活的关联管理,还允许开发者将复杂的数据关系逻辑封装在应用程序中,从而简化数据库设计,提高代码的可读性和可维护性。然而,这也要求开发者对Hibernate的映射机制...
- **Hibernate的作用**:主要用于处理后台DAO部分的代码,可以将复杂的数据库操作封装起来,使开发人员能够更方便地进行数据的增删改查等操作。 - **ORMapping**(对象关系映射):这是一种编程技术,用于将对象模型...
在给定的文件“Hibernate的char问题.txt”中,虽然描述较为模糊,但我们可以根据提供的 SQL 语句推测出,这里讨论的是在使用 Hibernate 进行数据查询时,如何正确地处理 `char` 类型的数据字段。 #### 三、问题分析...
但若需考虑缓存,两者都有各自的局限,且管理起来较为复杂。 5. 数据库支持:iBatis对不同数据库的支持不如Hibernate全面,如果项目需要跨数据库平台,Hibernate可能更适合。 6. 功能完备性:Hibernate提供了丰富...
**Hibernate**则是一种ORM(Object Relational Mapping,对象关系映射)框架,它简化了数据持久化层的复杂性,提供了比JDBC更为高级的功能,如缓存机制、事务管理以及对象关系映射等。通过使用Hibernate,开发者可以...
CMP 方式减少了代码量,但使用较为复杂,且对 EJB 规范的理解有一定门槛。 3. **JDO**:JDO 提供了一种更面向对象的方式来处理数据库操作,但是其实现不够成熟,性能优化也存在问题。 #### Hibernate 的特点与优势 ...
1. **对象-关系映射**:Hibernate 允许开发者以面向对象的方式处理数据库操作,从而简化了数据访问代码。 2. **易于集成**:Hibernate 可以轻松地与 Spring 等其他流行的 Java 框架集成。 3. **性能优化**:...