本文以Hibernate 5.x 版本的映射文件为例说明。
DTD约束
5.0以前的版本:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5.x版本:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
hbm.xml文件的根节点。
属性:
schema:可选,数据库schema的名称。
catalog:可选,数据库catalog的名称。
default-cascade:默认的级联策略,默认值:none(不进行任何级联)。
default-access:默认的属性访问策略,默认值:property(根据getter/setter来确定属性名)。
default-lazy:默认延迟加载,默认值:true。
auto-import:是否可以在HQL中使用非全限定的类名,默认值:true。
package:可选,定当前映射文件对应的持久类的完整包名。
<class>
<hibernate-mapping>
的子节点,用以定义一个持久化类与数据表的映射关系。
属性:
entity-name:可选,标识该pojo的实体名。如果设置该属性,在save等操作是必须告诉hibernate该逻辑名称。
例如,一个User的pojo,如果分为两种不同的user,可能其中某写字段相同,某些又不相同,可以在hbm.xml中同一个pojo的java类两次映射,对应的entity-name属性不同即可,这样操作一个pojo时就可以分别操作不同的表,前提是操作该pojo时必须指定entity-name。引用自这篇文章
name:可选,持久化类的全限定名。如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
proxy:可选,指定实现延迟加载的代理类。可参考这篇文章。
lazy:可选,是否使用延迟加载。
table:可选,为当前映射文件指定对应的数据库表名。
schema:可选,设置当前指定的持久类对应的数据库表的schema名。
catalog:可选,设置当前指定的持久类对应的数据库表的catalog名。
subselect:可选,将一个不可变并且只读的实体映射到一个数据库的子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。这个属性与
<class>
的子元素<subselect>
可以互换。discriminator-value:可选,当需要将一个表根据某个字段的值映射到不同的类(一般是兄弟类,即父类相同的类)时,这个类所对应的字段的值。
mutable:默认值为true。当设为false时,这个实体类可以进行插入和删除操作,但不可以进行更新(update)制作。
abstract:可选,用于在
<union-subclass>
的继承结构中标识抽象超类,取值:true、false。polymorphism:指定Hibernate查询时使用的多态方式,取值如下:
- implicit(隐式多态):默认值,在
SELECT FROM 类名
语句中,无论类名
是当前类或是父类,都可以查询到当前类的数据。 - explicit(显式多态):在
SELECT FROM 类名
语句中,只有当类名
是当前类时才能查询到数据。
- implicit(隐式多态):默认值,在
where:可选,指定一个附加的SQL语句的
where
条件persister:可选,指定这个实体类所使用的持久化策略
dynamic-update:动态更新,只更指明修改的字段,默认值是false。
dynamic-insert:动态插入,只插入指明值的字段,默认值是false。
batch-size:可选,批量抓取时每批次的抓取数量。
select-before-update:执行
update
之前是否通过select
语句来确定对象是否确实被修改了,如果该对象的值没有改变,update
语句将不会被执行。默认值是false。optimistic-lock:指定乐观锁定的策略,默认值为vesion。
check:可选,这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查。
rowid:可选,是否支持ROWID。
node:可选,备用属性,无特殊用途。
<id>
<class>
节点的子节点,定义当前映射文件对应的持久类的主键属性和数据表中主键字段的相关信息。
Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。
属性:
name:可选,对应的持久化类的属性名。
access:可选,Hibernate对本属性的访问策略,默认值为property。
column:可选,对应的数据库表的字段名。
type:可选,对应的数据库表的字段的数据类型。
length:可选,对应的数据库表的字段的长度。
unsaved-value:可选,用来标志该实例是刚刚创建的,尚未保存的。当一个实体对象的
id
值与本属性值相同时,Hibernate执行update()
操作,否则执行save()
操作。多数情况下此属性取null值比较实用。node:可选,备用属性,无特殊用途。
联合主键
联合主键可以采用以下的配置方式。<composite-id>
是<class>
节点的子节点,没有属性;<key-property>
节点相当于单主键时的<id>
节点
<composite-id>
<key-property name="username" />
<key-property name="password" />
</composite-id>
<generator>
<id>
节点的子节点,指定主键的生成器。
属性:
class:必选,取值为主键生成器的全限定类名。主键生成器必须是实现了
IdentifierGenerator
接口的类。Hibernate也内置了一些主键生成算法(可直接取下面的值作为此属性的值):native:由Hibernate根据使用的数据库自行判断采用
identity
、hilo
、sequence
其中一种作为主键生成方式。项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。guid:Globally Unique Identifier全球唯一标识符,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。与uuid的区别是:使用guid算法,Hibernate维护主键时,需要先访问数据库。
uuid:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:
xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
,其中每个x
是0~f
范围内的一个十六进制的数字。与guid的区别是:使用uuid算法,Hibernate维护主键时,需要无需先访问数据库。hilo:使用hilo算法生成主键。可实现跨数据库,但hilo算法生成的主键只能在一个数据库中保证唯一。
identity:由数据库自己生成标识符,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如MySql数据库。
increment:由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。适合单一进程访问数据库,不能用于群集环境。
assigned:Hibernate不负责维护主键生成,必须由程序指定主键的值。
foreign:使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。
select:使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。
org.hibernate.id.enhanced.SequenceStyleGenerator:取代了原来的
sequence
、sequence-identity
和seqhilo
。采用数据库提供的sequence机制生成主键,需要数据库支持sequence,如Oracle数据库。
<property>
<class>
节点的子节点,必须位于<id>
节点之后,用于持久化类的属性与数据库表字段之间的映射。
属性:
name:必选, 对应的持久化类的属性名。
access:可选, Hibernate对本属性的访问策略,默认值为property。
type:可选, 对应的数据库表的字段的类型。
column:可选, 对应的数据库表的字段名。
length:可选, 对应的数据库表的字段的长度。
precision:可选, 对应的数据库表的字段的小数精度。
scale:可选, 对应的数据库表的字段使用的数字进制。
not-null:可选,是否添加非空约束,默认为false。
unique:可选, 是否添加唯一约束,默认值false。
unique-key:可选,是否使用联合主键约束,默认值为false。
index:可选, include the columns spanned by this property in an index(暂未理解这里的意思)。
update:可选, update时是否包含本字段,默认为true。
insert:可选, insert时是否包含本字段,默认为true。
optimistic-lock:可选,指定这个属性在进行更新时是否使用乐观锁,默认值true。
formula:可选, 设置当前节点对应的持久类中的属性的值由指定的SQL语句(需要用括号括上)从数据库获取。
lazy:可选,是否使用延迟加载,默认值false。
generated:可选, 指定本属性是否在数据库中生成字段值。取值如下:
- never(默认):从不在数据库中生成。
- insert:新增时生成,更新时不改变。
- always。新增时生成,更新时改变。
node:可选,备用属性,无特殊用途。
<one-to-one>
<class>
节点的子节点,用于两表间一对一关联的映射。
属性:
name:可选, 实现关联的持久化类(本类)的属性名。
access:可选, Hibernate对实现关联(本类)的属性的访问策略,默认为property。
class:可选, 被关联的持久化类的类名。
entity-name:可选,被关联的类的实体名(具体请参考
<class>
节点的entity-name
属性)。cascade:可选, 设置操作中的级联策略。默认值为none(不进行任何级联)。
outer-join:可选,设置是否使用外连接抓取。如果设为true,那么Hibernate将使用一条SQL语句以外连接的方式把本类与关联类的数据都查出来,延迟加载将失效。默认值为auto。
fetch:可选, 设置抓取策略。当取值为select时(默认),使用多条SQL语句分别抓取,可实现延迟加载;当取值为join时,使用外连接方式抓取,延迟加载失效。
constrained:可选,当前类所对应的表与被关联的表是否存在外键约束,默认值false。
foreign-key:可选,指明被关联类的外键字段。
property-ref:可选,指定关联类的属性名,这个属性将会和本类的主键相对应。默认值为被关联类的主键。
formula:可选,绝大多数一对一关联都指向其实体的主键,在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL语句来表示。
lazy:可选, 是否使用延迟加载,默认为false。
node:可选, 备用属性,无特殊用途。
embed-xml:可选,默认值true。
<many-to-one>
<class>
节点的子节点,用于两表间多对一关联的映射。
属性:
name:可选, 实现关联的持久化类(本类)的属性名。
access:可选, Hibernate对实现关联(本类)的属性的访问策略,默认为property。
class:可选, 被关联的持久化类的类名。
entity-name:可选,被关联的类的实体名(具体请参考
<class>
节点的entity-name
属性)。column:可选,实现关联的数据库表的字段名。
not-null:可选,是否添加非空约束,默认为false。
unique:可选, 是否添加唯一约束,默认值false。
unique-key:可选,是否使用联合主键约束,默认值为false。
index:可选, include the columns spanned by this property in an index(暂未理解这里的意思)。
update:可选, update时是否包含本字段,默认为true。
insert:可选, insert时是否包含本字段,默认为true。
optimistic-lock:可选,指定这个属性在进行更新时是否使用乐观锁,默认值true。
formula:可选, 设置当前节点对应的持久类中的属性的值由指定的SQL语句(需要用括号括上)从数据库获取。
lazy:可选,是否使用延迟加载,默认值false。
cascade:可选, 设置操作中的级联策略。默认值为none(不进行任何级联)。
outer-join:可选,设置是否使用外连接抓取。如果设为true,那么Hibernate将使用一条SQL语句以外连接的方式把本类与关联类的数据都查出来,延迟加载将失效。默认值为auto。
fetch:可选, 设置抓取策略。当取值为select时(默认),使用多条SQL语句分别抓取,可实现延迟加载;当取值为join时,使用外连接方式抓取,延迟加载失效。
foreign-key:可选,指明被关联类的外键字段。
property-ref:可选,指定关联类的一个属性,这个属性将会和本外键相对应。。默认值为被关联类的主键。
not-found:可选,指定引用的外键不存在时将如何处理。默认值exception(抛出异常),可选值ignore(忽略)。
node:可选, 备用属性,无特殊用途。
embed-xml:可选,默认值true。
<many-to-many>
<class>
节点的子节点,用于两表间多对多关联的映射。
属性:
class:可选,被关联的持久化类的类名。
entity-name:可选,被关联的类的实体名(具体请参考
<class>
节点的entity-name
属性)。column:可选,实现关联的字段名。
formula:可选, 设置当前节点对应的持久类中的属性的值由指定的SQL语句(需要用括号括上)从数据库获取。
not-found:可选,指定引用的外键不存在时将如何处理。默认值exception(抛出异常),可选值ignore(忽略)。
outer-join:可选,设置是否使用外连接抓取。如果设为true,那么Hibernate将使用一条SQL语句以外连接的方式把本类与关联类的数据都查出来,延迟加载将失效。默认值为auto。
fetch:可选, 设置抓取策略。当取值为select时(默认),使用多条SQL语句分别抓取,可实现延迟加载;当取值为join时,使用外连接方式抓取,延迟加载失效。
lazy:可选,是否使用延迟加载,默认值false。
foreign-key:可选,指明被关联类的外键字段。
unique:可选,是否添加唯一约束,默认false。
where:可选,在SQL中添加
where
语句。order-by:可选,在SQL中添加
order by
语句property-ref:可选,指定关联类的一个属性,这个属性将会和本外键相对应。。默认值为被关联类的主键。
node:可选, 备用属性,无特殊用途。
embed-xml:可选,默认值true。
<set>、<list>、<map>
<class>
节点的子节点,用于用于指定集合映射。其内部必须包含一个<key>
节点和若干属性节点。
区别:
<set>
:集合内的对象不排序,没有重复对象。<list>
:集合内的对象按照索引位置排序,可以有重复对象。<map>
:集合内的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,可以有重复的值对象,但key是唯一的。
属性:
name:必选, 对应的持久化类的属性名。
access:可选, Hibernate对本属性的访问策略,默认为property。
table:可选, 被关联的目标数据库表。
schema:可选, 被关联的目标数据库schema名。
catalog:可选, 被关联的目标数据库catalog名。
subselect:可选, 定义一个子查询,可被
<subselect>
子节点代替。lazy:可选, 是否使用延迟加载。
sort:可选, 设置排序的类型。默认值为unsorted(不排序),可选值有natural(自然排序)、实现了
comparator
接口的类的全限定类名。注意避免与order-by
同时使用。inverse:可选, 用于标识双向关联中被动的一方,默认值为false。
mutable:可选, 被关联对象是否可以改变,默认值为true
cascade:可选, 级联操作时的级联策略。
order-by:可选,在SQL中添加
order by
语句where:可选, 可选,在SQL中添加
where
语句batch-size:可选,延迟加载时一次读取数据的数量,默认值为1。
outer-join:可选,设置是否使用外连接抓取。如果设为true,那么Hibernate将使用一条SQL语句以外连接的方式把本类与关联类的数据都查出来,延迟加载将失效。默认值为auto。
fetch:可选, 设置抓取策略。当取值为select时(默认),使用多条SQL语句分别抓取,可实现延迟加载;当取值为join时,使用外连接方式抓取,延迟加载失效。
persister:可选,指定这个实体类所使用的持久化策略
collection-type:可选,映射的集合类型。
check:可选, 校验?
optimistic-lock:可选,指定这个属性在进行更新时是否使用乐观锁,默认值true。
node:可选, 备用属性,无特殊用途。
embed-xml:可选,默认值true。