您的位置:首页 > 其它

Hibernate --- xxx.hbm.xml映射配置文件详解

2018-01-07 21:50 330 查看
一、Hibernate映射文件

映射配置文件它的名称是类名.hbm.xml,它一般放置在实体类所在的包下。这个配置文件的主要作用是建立表与类的映射关系。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hibernate.domain">
<!--
name属性它是实体类的全名
table 表的名称
catalog 数据库名称
-->
<class name="Customer" table="t_customer" catalog="hibernateTest">
<!-- id它是用于描述主键 -->
<id name="id" column="id" type="int">  <!-- java数据类型 -->
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>

<!-- 使用property来描述属性与字段的对应关系 -->
<property name="name" column="name" length="20" type="string"></property>  <!-- hibernate数据类型 -->
<property name="address">
<column name="address" length="50" sql-type="varchar(50)"></column> <!-- sql数据类型 -->
</property>
<!-- <property name="sex" column="sex" length="20"></property> -->
</class>
</hibernate-mapping>


二、Hibernate映射文件详解

2.1 <hibernate-mapping>

每一个hbm.xml文件都有唯一的一个根元素,包含一些可选的属性

属性:

package : 指定当前映射文件对应的持久化类的完整包名
schema : 指定当前映射文件对应的数据库表的schema名
catalog : 指定当前映射文件对应的数据库表的catalog名
default-cascade : 设置默认的级联方式(默认值为none)
default-access : 设置默认的属性访问方式(默认值为property)
default-lazy : 设置对没有指定延迟加载的映射类和集合设定为延迟加载(默认值为true)
auto-import : 设置当前映射文件中是否可以在HQL中使用非完整的类名(默认为true)

子标签:

class : 为当前映射文件指定对应的持久化类名和对应的数据库表名
subclass : 指定多态持久化操作时当前映射文件对应的持久化类的子类
meta : 设置类或属性的元数据属性
typedef : 设置新的Hibernate数据类型
joined-subclass : 指定当前联结的子类
union-subclass : 指定当前联结的子类
query : 定义一个HQL查询
sql-query : 定义一个SQL查询
filter-def : 指定过滤器

2.2 <class>

根元素的子元素,用以定义一个持久化类与数据表的映射关系

属性:

name : 为当前映射文件指定对应的持久化类
table : 为当前映射文件指定对应的数据库表名
schema : 设置当前指定的持久化类对应的数据库表的schema名
catalog : 设置当前指定的持久化类对应的数据库表的catalog名
lazy : 设置是否使用延迟加载
batch-size : 设置批量操作记录的数目(默认值为1)
check : 指定一个SQL语句用于Schema前的条件检查
where : 指定一个附加的SQL语句的where条件
rowid : 指定是否支持ROWID
entity-name : 实体名称,默认值为类名
subselect : 将不可变的只读实体映射到数据库的子查询中
dynamic-update : 指定用于update的SQL语句是否动态生成,默认值为false
dynamic-insert : 指定用于insert的SQL语句是否动态生成,默认值为false
insert-before-update : 设定在Hibernate执行update之前是否通过select语句来确定对象是否确实被修改了
abstract : 用于在联合子类中标识抽象的超类(默认值为false)
emutable : 表明该类的实例是否是可变的,默认值为false
proxy : 指定延迟加载代理类
polymorphism : 指定使用多态查询的方式,默认值为import
persister : 指定一个Persister类
discriminator-value : 子类识别标识,默认值为类名
optimistic-lock : 指定乐观锁定的策略,默认值为vesion

子标签:

id : 定义当前映射文件对应的持久化类的主键属性和数据表中主键字段的相关信息
property : 定义当前映射文件对应的持久化类的属性和数据表中字段的相关信息
sql-insert : 使用定制的SQL语句执行insert操作
sql-delete : 使用定制的SQL语句执行delete操作
sql-update : 使用定制的SQL语句执行update操作
sql-query : 定义装载实体的SQL语句
subselect : 定义一个子查询
comment : 定义表的注释
composite-id : 持久化类与数据库表对应的联合主键
many-to-one : 定义对象间的多对一的关联关系
one-to-one : 定义对象间的一对一的关联关系
any : 定义any映射类型
map : map类型的集合映射
set : set类型的集合映射
list : list类型的集合映射
array : array类型的集合映射
bag : bag类型的集合映射
primitive-array : primitive-array类型的集合映射
query : 定义装载实体的HQL语句
synchronize : 定义持久化类锁需要的同步资源
query-list : 映射由查询返回的集合
natural-id : 声明一个唯一的业务主键
join : 将一个类的属性映射到多张表中
sub-class : 声明多态映射中的子类
joined-subclass : 声明多态映射中的连接子类
union-subclass : 声明多态映射中的联合子类
loader : 定义持久化对象的加载器
filter : 定义Hibernate使用的过滤器
component : 定义组件映射
dynamic-component : 定义动态组件映射
properties : 定义一个包含多个属性的逻辑分组
cache : 定义缓存的策略
discriminator : 定义一个鉴别器
meta : 设置类或属性的元数据属性
timestamp : 指定表中包含时间戳的数据
version : 指定表所包含的附带版本信息的数据

2.3 <id>

Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系

属性:

name : 指定当前映射对应的持久化类的主键名
column : 指定当前映射对应的数据库表中的主键名(默认值为对应持久化类的主键/属性名)
type : 指定当前映射对应的数据库表中的主键的数据类型 --- 查看Hibernate数据类型
unsaved-value : 判断此对象是否进行了保存
access : Hibernate访问主键属性的策略(默认值为property)

子标签:

meta : 设置类或属性的元数据属性
column : 指定当前映射对应的数据库表中的主键名(默认值为对应持久化类的主键/属性名)
type : 指定当前映射对应的数据库表中的主键的数据类型
generator : 主键生成策略

2.4 <generator>

主键生成策略是必须配置,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用<param>元素来传递。

属性:

class : 主键生成策略实现类,Hibernate提供了很多内置的实现:

increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。 (数据库自增)

sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)

hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串,它的生成是由hibernate生成,一般不会重复。
UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了

guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。

native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。(数据库自增)

assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。(如果是手动分配,则需要设置此配置)

select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

子标签:

param : 配置值或初始化参数

2.5 <property>

用于持久化类的属性与数据库表字段之间的映射

属性:

name : 持久化类的属性名,以小写字母开头
column : 数据库表的字段名
type : Hibernate数据类型的名字 --- 查看Hibernate数据类型
update | insert : 表名用于update或insert的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false,则表明这是一个"外源性(derived)"的属性,它的值来源于映射到同一个(或多个)字段某些其他属性,或者通过一个trigger(触发器)或其他程序生成。 
formula : 设置当前节点对应的持久化类中的属性的值由指定的SQL从数据库获取
注意:指定的SQL必须用()括起来,指定SQL中使用列时必须用表的别名加列名的方式访问,但如果指定SQL中要使用当前映射对应的列时不能用表的别名加列名的方式访问,而是直接访问即可。如:formula="(select tn.columnName from tableName tn where tn.columnName=当前映射中的属性名)"

unique : 设置该字段的值是否唯一(默认值为false)
not-null : 设置该字段的值是否可以为null(默认值为false)
length : 当type为varchar时,设置字段长度
not-found : 设置当前节点对应的数据库字段为外键时引用的数据不存时如何处理(默认值为exception:产生异常,可选值为ignore:对不存在的应用关联到null)
property-ref : 设置关联类的属性名,此属性和本类的关联相对应,默认值为关联类的主键
entity-name : 被关联类的是提名
lazy : 指定是否采用延迟加载即加载策略(默认值为proxy:通过代理进行关联,可选值为true:此对象采用延迟加载并在变量第一次被访问时抓取、false:此关联对象不采用延迟加载)
access : Hibernate访问这个属性的策略(默认值为property)
optimistic-lock : 指定此属性做更新操作时是否需要乐观锁定(默认值为true)

2.6 <one-to-one>

一对一的映射关系

属性:

name : 映射类属性的名字
class : 关联类的名字
formula : 绝大多数一对一关联都指向其实体的主键。在某些情况下回指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示
cascade : 设置级联操作时的级联类型
constrained : 表名当前类对应的表与被关联的表之间是否存在外键约束,默认值为false
fetch : 设置抓取数据的策略,可选值为join外链接抓取、select序列选择抓取
property-ref : 设置关联类的属性名,此属性和本类的主键相对应,默认值为关联类的主键
access : Hibernate访问这个属性的策略(默认值为property)
lazy : 指定是否采用延迟加载及加载策略,默认值为proxy,通过代理进行关联,可选值为true:此对象采用延迟加载并在变量第一次被访问时抓取、false:比关联对象不采用延迟加载
entity-name : 被关联类的实体名 

2.7 <many-to-one>

多对一的映射

属性:

name: 映射类属性的名字
class: 关联类的名字
formula: 绝大多数一对一关联都指向其实体的主键。在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示
column: 中间关联表映射到目标关联表的关联字段
cascade: 设置级联操作时的级联类型
fetch: 设置抓取数据的策略 默认值为select序列选择抓取 可选值为join外连接抓取
lazy: 指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载
update: 进行update操作时是否包含此字段
insert: 进行insert操作时是否包含此字段
not-found: 指定外键引用的数据不存在时如何让处理 默认值为exception产生异常 可选值为ignore对不存在的应用关联到null

2.8 <many-to-many>

多对多

2.9 <set>

set集合

属性:

name: 映射类属性的名字
table: 关联的目标数据库表
schema: 目标数据库表的schema名字
catalog: 目标数据库表的catalog名字
subselect: 定义一个子查询
sort: 设置排序的类型 默认值为 unsorted不排序 可选值为 natural自然排序、comparatorClass实现接口类作为排序算法 避免与order-by同时使用
lazy: 是否采用延迟加载
inverse: 用于标识双向关联中被动的一方 默认值为false
cascade: 设置级联操作时的级联类型
mutable: 标识被关联对象是否可以改变 默认值为true
order-by: 设置排序规则
where: 增加筛选条件
batch-size: 延迟加载时,一次读取数据的数量 默认值为1
fetch: 设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取

2.10 <list>

list集合

2.11 <map>

map集合

三、Hibernate数据类型

Java数据类型Hibernate数据类型标准SQL数据类型(PS:对于不同的DB可能有所差异)
byte、java.lang.BytebyteTINYINT
short、java.lang.ShortshortSMALLINT
int、java.lang.IntegerintegerINGEGER
long、java.lang.LonglongBIGINT
float、java.lang.FloatfloatFLOAT
double、java.lang.DoubledoubleDOUBLE
java.math.BigDecimalbig_decimalNUMERIC
char、java.lang.CharactercharacterCHAR(1)
boolean、java.lang.BooleanbooleanBIT
java.lang.StringstringVARCHAR
boolean、java.lang.Booleanyes_noCHAR(1)('Y'或'N')
boolean、java.lang.Booleantrue_falseCHAR(1)('Y'或'N')
java.util.Date、java.sql.DatedateDATE
java.util.Date、java.sql.TimetimeTIME
java.util.Date、java.sql.TimestamptimestampTIMESTAMP
java.util.CalendarcalendarTIMESTAMP
java.util.Calendarcalendar_dateDATE
byte[]binaryVARBINARY、BLOB
java.lang.StringtextCLOB
java.io.SerializableserializableVARBINARY、BLOB
java.sql.ClobclobCLOB
java.sql.BlobblobBLOB
java.lang.ClassclassVARCHAR
java.util.LocalelocaleVARCHAR
java.util.TimeZonetimezoneVARCHAR
java.util.CurrencycurrencyVARCHAR
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: