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数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...
多对多关联较为复杂,如学生和课程的关系,一个学生可以选修多门课程,反之亦然。Hibernate通过`@ManyToMany`注解处理这种关系,并通常需要一个中间表来存储双方的连接信息。`@JoinTable`注解用于定义中间表,包括其...
### Hibernate 数据持久化组件 #### 一、背景与概述 在现代软件开发中,数据持久化是一项关键的技术,它解决了程序运行过程中数据的保存问题。根据题目提供的信息,“内存是暂时存储设备,断电后数据易丢失”,这...
Hibernate的实体关联映射是其核心功能之一,它通过灵活的配置来适应不同场景下的数据持久化需求。通过对一对一、一对多、多对多等映射关系的熟练掌握和灵活运用,可以有效地处理复杂的实体关系,提高开发效率和应用...
在这个“Hibernate(23):一个较为复杂些的例子”中,我们将深入探讨如何在实际项目中运用Hibernate处理更为复杂的业务场景。通过访问博文链接,你可以找到更详细的步骤和解释。 首先,让我们了解ORM的基本概念。ORM...
多对多关联是一种较为复杂的关系类型,通常需要通过中间表来维护两个实体类之间的关联。在选课系统中,一个学生可以选修多个课程,而一个课程也可以被多个学生选修。 **配置文件** (`Student.hbm.xml`): ```xml ...
Map在Hibernate中的映射较为复杂,涉及`<map>`、`<key>`、`<index>`和`<element>`等多个标签。`<key>`标签用于定义Map的主键,`<index>`和`<element>`则分别用于定义Map的键和值。Map映射在处理具有复杂关联的数据...
### Hibernate配置数据连接详解 #### 一、概述 在Java持久化框架中,Hibernate是非常流行的ORM(对象关系映射)工具之一。为了更好地管理和优化数据库连接资源,Hibernate支持多种连接池技术,例如c3p0和Proxool等...
介绍如何使用 Hibernate 的动态元数据映射来处理结构不确定的数据。 - **4.5 Tuplizer** Tuplizer 是 Hibernate 中用于将 ResultSet 转换为 Java 对象的组件,它提供了更多的灵活性和控制能力。 #### 七、基本...
这种方式适用于那些较为复杂的SQL查询,尤其是在HQL无法满足需求的情况下。 ### 查询结果处理 对于连表查询的结果处理,通常有两种常见的方式: #### 1. 获取单个字段值 如果只需要查询结果中的一个或几个字段,...
- 也是较为知名的 ORM 框架,但在 Java 社区中的使用频率低于 Hibernate 和 MyBatis。 #### 五、Hibernate 与 JDBC 的比较 - **Hibernate 实现**: - 通过安装 Hibernate 插件,例如 hibernatetools-4.1.1.Final...
Hibernate 是一个开源的对象关系映射 (ORM) 工具,它极大地简化了 Java 应用程序中数据的持久化操作。对象关系映射是一种编程技术,用于在关系数据库和对象之间建立一个桥梁,使得开发者可以使用面向对象的方式来...
**Hibernate** 是一款开源的对象关系映射框架,它允许开发者以透明的方式处理持久化POJO(Plain Old Java Object)。Hibernate的核心优势在于它能够自动处理对象与关系型数据库之间的映射,极大地减轻了开发者的负担...
在给定的“hibernate 开发工具包”中,包含的是Hibernate 3.3.2版本的jar包,这是一个相对较为早期但仍然被一些项目使用的版本。以下是关于Hibernate 3.3.2及其关键特性的详细解释: 1. **对象关系映射(ORM)**:...
在IT行业中,Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本项目旨在模仿Hibernate的核心功能,以加深对ORM的理解并锻炼Java编程能力...
2. **学习曲线**:Hibernate的学习曲线相对较陡,因为它涉及的对象关系映射和查询语言较为复杂;而IBatis相对简单,更易于理解和上手。 3. **性能**:由于Hibernate的自动对象管理,可能会产生额外的数据库交互,...
总之,Hibernate的多对一和一对多操作不仅提供了灵活的关联管理,还允许开发者将复杂的数据关系逻辑封装在应用程序中,从而简化数据库设计,提高代码的可读性和可维护性。然而,这也要求开发者对Hibernate的映射机制...
WebWork 2.1.7版本是一个较为成熟的版本,提供了一系列功能强大的特性,如请求映射、类型转换、数据验证、国际化等,使得开发者能够更专注于业务逻辑而非框架细节。通过使用`webwork2.1.7.jar`、`xwork.jar`、`os...