Hibernate
的映射关系,个人认为是非常重要的部分,映射关系的配置是在把握整体项目中所有实体之间的关联关系的基础上进行的,以前做项目时,在写这些映射文件时,总是对着
UML
图一个个仔仔细细的写。
Ok
,废话少说,上代码说明。
先说明几点
1
、关联关系的本质是将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用;
2
、关联关系分为单向和双向,单向即
A
、
B
两个对象关联,
A
能够查询得到对应关联的
B
,
B
查询得不到关联的
A
,或者反过来。双向即
A
能够关联查询到
B
,
B
也能关联查询到
A
;
3
、因为
Java
中的
list
是有顺序的
,
所有在
Hibernate
中一般常用
set
,
所以在实体类中的对多的一方
,
其属性值用
set
集合而不用
list
集合
;
下面来从关联数量上对:一对多、多对一、一对一、多对多配置进行说明,至于如果是单向,只要在一边配置关联关系,一边不配置,如果是双向则两边都配置关联关系即可。
一对多
<class name="Company" table="tbl_company">
<id name="id" type="int"><generator class="native" /><!-- 主键增值方式 -->
</id>
<property name="name"></property>
<set name="employees" cascade="all" order-by="id desc">
<key column="c_id">
</key>
<one-to-many class="Employee"/>
</set>
</class>
说明
:
1
、
在
set
中的
name
为
Company
类中的属性名
,order-by="id desc
"
按
id
排序
,
column
为外键
,
为
many
的目标
;
2
、<set>
元素的inverse
属性,在映射一对多的双向关联时,应该在one
方把inverse
属性设为true
,这样可提高应用性能
Inverse
:控制反转,为true
表示反转,由它方负责;反之,不反转,自己负责,如果不设,one
和many
两方都要负责控制,因此,会引发重复的sql
语句以及重复添加数据。
多对一
<class name="Employee" table="tbl_employee">
<id name="id" type="int"> </id>
<property name="name"></property>
<many-to-one name="company" class="Company" cascade="all" column="c_id"></many-to-one>>
</class>
说明:
1、注意这里的
column
如果在数据库中的这个字段与
java
类中的字段名一致,则
column
可以不用写
,这里最好使用,因为如果不用
Hibernate
还要自动去识别,相对来说消耗了部分性能。
2、在many-to-one中的company是Employee中的字段,one的目标Company,注意这里的Employee类中要加Company对象
3、many-to-one元素的常用属性:
属性
|
含义和作用
|
必填
|
默认值
|
name
|
映射类属性名称
|
Y
|
|
class
|
关联类的完全限定名
|
N
|
|
column
|
关联的字段
|
N
|
|
not-null
|
设置关联的字段的值是否可以为空
|
N
|
false
|
lazy
|
指定关联对象是否使用延迟加载以及延迟加载的策略
|
N
|
proxy
|
fetch
|
设置抓取数据的策略
|
N
|
select
|
这里的抓取策略对
Hibernate
的性能提升也有很大帮助
,
详细的留在以后介绍。
4
、重要属性
----cascade
(级联),其意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
all
:代表在所有的情况下都执行级联操作
none
:在所有情况下都不执行级联操作
save-update
:在保存和更新的时候执行级联操作
delete
:在删除的时候执行级联操作
若要多个操作都产生级联则:可以用
,
分开如:
save-update,delete
在这里我们需要区分
inverse
和
cascade
:
Inverse
:负责控制关系,默认为
false
,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为
true
。
Cascade
:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
1
、
cascade
定义的是关系两端对象到对象的级联关系;而
inverse
定义的是关系和对象的级联关系。
2
、
inverse
只对
set+one-to-many(
或
many-to-many)
有效,对
many-to-one,
one-to-one
无效。
cascade
对关系标记都有效。
3
、
inverse
对集合对象整体起作用,
cascade
对集合对象中的一个一个元素起作用,如果集合为空,那么
cascade
不会引发关联操作。
多对多
<class name="Student" table="tbl_student">
<id name="id" type="int"><column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="cources" table="tbl_sc" cascade="all"><!-- 这里的cources是Student类中的对应属性 -->
<key column="s_id"></key><!-- 注意这里的column是class所对应表中在sc表中对应的id -->
<!-- 这里的column是 Cource在关系表中所对应的字段-->
<many-to-many class="Cource" column="c_id"></many-to-many>
</set>
</class>
<class name="Cource" table="tbl_cource">
<id name="id" type="int"><column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="students" table="tbl_sc" cascade="all">
<key column="c_id"></key>
<many-to-many class="Student" column="s_id"></many-to-many>
</set>
</class>
一对一
说明:
1
、有主键的
1
对
1
,就是一个表中的主键
id
与另一个表中的主键
id
一一对应;
2
、有基于外键的
1
对
1
,就是一个表的主键与另一个表中的外键一一对应,同时将这个表的外键设为唯一;
基于主键的一对一:
<class name="IdCard" table="tbl_idcard">
<id name="id">
<!--id引用外部主键 -->
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="idCard" column="IdCard" />
<one-to-one name="person" constrained="true" cascade="all"></one-to-one>
</class>
<class name="Person" table="tbl_person">
<id name="id" type="int">
<generator class="native" />
</id>
<property name="name" />
<one-to-one name="card" cascade="all"></one-to-one>
</class>
说明:
one-to-one
标签
Hibernate
根据主键加载引用对象,把
person
中的主键拿到
idCard
表中进行查找,然后把查到的信息加载到引用对象中采用一对一主键约束,那么必须设置
constrained
属性,表示当前主键作为外键参照了该属性在一对一主键关联映射中默认问级联属性
基于外键的一对一:
<class name="Teacher" table="tbl_teacher">
<id name="id" type="int"><column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!--unique="true"表示唯一,这是区别与多对一关系 -->
<many-to-one name="cource" class="Cource" cascade="all" column="c_id" unique="true">
</many-to-one>
</class>
<class name="Cource" table="tbl_cource">
<id name="id" type="int"><column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!-- 注意这里的 property-ref="cource"是teacher表中的字段-->
<one-to-one name="teacher" property-ref="cource" cascade="all"></one-to-one>
</class>
项目中遇到的特殊关系的处理
1、上下级输出
<class name="Employee" table="tbl_employee">
<id name="id" type="int">
<generator class="native" />
</id>
<property name="name"></property>
<many-to-one name="company" class="Company" cascade="all" column="c_id"></many-to-one>
<!-- 多对一,即多个员工有一个上级领导 --><!-- not-found="ignore"当级联时没有此字段时则忽略 -->
<many-to-one name="supEmployee" class="Employee" cascade="all" column="sup_id" not-found="ignore"></many-to-one>
<!-- 一对多,一个领导有多个员工 -->
<set name="subEmployees" cascade="all"><!-- set中这里默认延迟加载为true,one to many中也是 -->
<key column="sup_id"> </key>
<one-to-many class="Employee"/>
</set>
</class>
分享到:
相关推荐
Hibernate,作为Java领域最著名的对象关系映射(ORM)框架之一,自诞生以来就备受开发者喜爱。本次我们关注的是其3.6.2.Final版本的源码包——`hibernate-distribution-3.6.2.Final-dist`,它为无法访问外部网络的...
Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发中的重要工具。本资源集合包含`hibernate-distribution-3.6.2`版本的API中文文档以及相关的jar包,旨在帮助开发者更好地理解和使用Hibernate框架。 ...
3. **映射对象**:创建实体类并使用注解或XML文件定义其与数据库表的映射关系。 4. **配置log4j**:根据需求调整log4j的配置,定义日志级别、输出格式和目的地。 5. **建立会话工厂**:使用Configuration实例和配置...
在Hibernate中,它用于处理Hibernate的配置文件,如hibernate.cfg.xml,以及映射文件(hbm.xml),这些文件定义了对象与数据库表之间的映射关系。 6. **slf4j-api-1.6.1.jar**:Simple Logging Facade for Java(SLF4...
Hibernate是Java平台上的一款著名的关系型数据库对象映射(ORM)框架,它极大地简化了数据库操作。这个`hibernate-distribution-3.6.2.Final-dist`版本的jar包是一个开发基本包,包含了用于开发 Hibernate 应用的...
Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发中的重要工具,它极大地简化了数据库操作,使得开发者能够用面向对象的方式来处理数据。本篇文章将深入探讨Hibernate Core 3.3.2.GA版本的API,该版本...
2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 2.3.2 JDO模式 2.3.3 CMP模式 2.4 Hibernate API简介 ...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 2.3.2 JDO模式 2.3.3 CMP模式 2.4 Hibernate API简介 ...
2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 2.3.2 JDO模式 2.3.3 CMP模式 2.4 Hibernate API简介 ...
2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式 2.3.1 主动域对象模式 2.3.2 JDO模式 2.3.3 CMP模式 2.4 Hibernate API简介 ...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
Hibernate 4.2 是一个流行的Java对象关系映射(ORM)框架,用于简化数据库操作。这个官方最新的jar包集合包含了Hibernate的核心组件和其他依赖库,使得开发者可以轻松地在应用程序中集成和使用Hibernate。 1. **...
2. **Hibernate**:Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。Hibernate 4.2 版本引入了对JPA 2.1的支持和其他性能优化。`hibernate-core-4.1.9.Final.jar...
Hibernate4.2作为ORM(Object-Relational Mapping)框架,简化了数据库操作,将对象模型与关系数据库映射。在这个版本中,Hibernate提高了查询效率,支持了更多的JPA规范,以及对HQL(Hibernate Query Language)和...
9.3.1 在Hibernate反向工程中定制映射关系 153 9.3.2 使用HQL编辑器 154 9.4 Hibernate应用实例:基于Struts+Hibernate的登录系统 155 9.5 本章小结 160 第10章 Spring框架的开发及应用 161 10.1 Spring框架概述 161...
1. **hibernate-core-4.2.0.Final.jar**:这是Hibernate ORM框架的核心库,它实现了对象关系映射(ORM)技术,使得开发者可以用Java对象来操作数据库,减少了对SQL的直接依赖。Hibernate提供事务管理、缓存机制和...
5. **hibernate-core-4.1.9.Final.jar**:这是一个ORM(Object-Relational Mapping,对象关系映射)框架,用于将Java对象映射到数据库表。Hibernate与Spring集成,可以方便地进行数据持久化操作,简化数据库访问。 ...
11.1.1 Hibernate版本的DAO实现 194 11.1.2 JDBC版本的DAO实现 199 11.2 为其他数据源使用DAO模式 203 11.2.1 示例:为LDAP使用DAO 203 11.2.2 示例:为Web服务使用DAO 208 11.3 使用Spring DAO 209 11.3.1 编写代码...
4.1 简化的orm和grails对象关系映射(gorm) 4.2 gorm基础 4.3 设置属性可选 4.4 gorm中的关系 4.5 执行crud操作 4.5.1 创建书签 4.5.2 读取书签 4.5.3 更新书签 4.5.4 ...