转自尚硅谷
hibernate-mapping:
•
hibernate-mapping
是
hibernate
映射文件的根元素
–
schema:
指定所映射的数据库
schema
的名称。若指定该属性
,
则表明会自动添加该
schema
前缀
–
catalog:
指定所映射的数据库
catalog
的名称。
–
default-cascade(
默认为
none):
设置
hibernate
默认的级联风格
.
若配置
Java
属性
,
集合映射时没有指定
cascade
属性
,
则
Hibernate
将采用此处指定的级联风格
.
–
default-access
(
默认为
property):
指定
Hibernate
的默认的属性访问策略。默认值为
property,
即使用
getter,setter
方法来访问属性
.
若指定
access,
则
Hibernate
会忽略
getter/setter
方法
,
而通过反射访问成员变量
.
–
default-lazy(
默认为
true):
设置
Hibernat
morning
的延迟加载策略
.
该属性的默认值为
true,
即启用延迟加载策略
.
若配置
Java
属性映射
,
集合映射时没有指定
lazy
属性
,
则
Hibernate
将采用此处指定的延迟加载策略
–
auto-import(
默认为
true):
指定是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
–
package (
可选
):
指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。
class:
id:
class:
•
class
元素用于指定类和表的映射
–
name
:
指定该持久化类映射的持久化类的类名
–
table
:
指定该持久化类映射的表名
,Hibernate
默认以持久化类的类名作为表名
–
dynamic-insert
:
若设置为
true,
表示当保存一个对象时
,
会动态生成
insert
语句
,insert
语句中仅包含所有取值不为
null
的字段
.
默认值为
false
–
dynamic-update
:
若设置为
true,
表示当更新一个对象时
,
会动态生成
update
语句
,update
语句中仅包含所有取值需要更新的字段
.
默认值为
false
–
select-before-update
:
设置
Hibernate
在更新某个持久化对象之前是否需要先执行一次查询
.
默认值为
false
–
batch-size
:
指定根据
OID
来抓取实例时每批抓取的实例数
.
–
lazy
:
指定是否使用延迟加载
.
–
mutable
:
若设置为
true,
等价于所有的
<property>
元素的
update
属性为
false,
表示整个实例不能被更新
.
默认为
true.
–
discriminator-value
:
指定区分不同子类的值
.
当使用
<subclass/>
元素来定义持久化类的继承关系时需要使用该属性
•
id
:设定持久化类的
OID
和表的主键的映射
–
name
:
标识持久化类
OID
的属性名
–
column
:
设置标识属性所映射的
数据表的
列名
(
主键字段的名字
).
–
unsaved-value
:
若设定了该属性
,Hibernate
会通过比较持久化类的
OID
值和该属性值来区分当前持久化类的对象是否为临时对象
–
type
:
指定
Hibernate
映射类型
.Hibernate
映射类型是
Java
类型与
SQL
类型的桥梁
.
如果没有为某个属性显式设定映射类型
,Hibernate
会运用反射机制先识别出持久化类的特定属性的
Java
类型
,
然后自动使用与之对应的默认的
Hibernate
映射类型
–
Java
的基本数据类型和包装类型对应相同的
Hibernate
映射类型
.
基本数据类型无法表达
null,
所以对于持久化类的
OID
推荐使用包装类型
generator:
•
generator
:设定持久化类设定标识符生成器
–
class:
指定使用的标识符生成器全限定类名或其缩写名
主键生成策略generator
increment 标识符生成器
•
increment
标识符生成器
由
Hibernate
以递增的方式为代理主键赋值
•
Hibernate
会先读取
NEWS
表中的主键的最大值
,
而接下来向
NEWS
表中插入记录时
,
就在
max(id)
的基础上递增
,
增量为
1.
•
适用范围
:
–
由于
increment
生存标识符机制不依赖于底层数据库系统
,
因此它适合所有的数据库系统
–
适用于只有单个
Hibernate
应用进程
访问同一个数据库的场合
,
在集群环境下不推荐使用它
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
identity 标识符生成器
sequence 标识符生成器
identity 标识符生成器
•
identity
标识符生成器由底层数据库来负责生成标识符
,
它要求底层数据库把主键定义为自动增长字段类型
•
适用范围
:
–
由于
identity
生成标识符的机制依赖于底层数据库系统
,
因此
,
要求底层数据库系统必须支持自动增长字段类型
.
支持自动增长字段类型的数据库包括
:DB2,
Mysql
,
MSSQLServer
,Sybase
等
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
•
sequence 标识符生成器
•
sequence
标识符生成器利用底层数据库提供的序列来生成标识符
.
•
<id
name="
id"
>
•
<generator
class="
sequenct"
>
• <paramname="sequence">news_seq</param>
• </generator>
•</id>
• </generator>
•</id>
•
Hibernate
在持久化一个
News
对象时
,
先从底层数据库的
news_seq
序列中获得一个唯一的标识号
,
再把它作为主键值
•
适用范围
:
–
由于
sequence
生成标识符的机制依赖于底层数据库系统的序列
,
因此
,
要求底层数据库系统必须支持序列
.
支持序列的数据库包括
:DB2, Oracle
等
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
hilo标识符生成器
•
hilo
标识符生成器由
Hibernate
按照一种
high/low
算法*生成标识符
,
它从数据库的特定表的字段中获取
high
值
.
<id name="id">
<generator class="hilo">
<param name="table">HI_TABLE</param>
<param name="column">NEXT_VALUE</param>
<param name="max_lo">10</param>
</generator>
</id>
<generator class="hilo">
<param name="table">HI_TABLE</param>
<param name="column">NEXT_VALUE</param>
<param name="max_lo">10</param>
</generator>
</id>
•
Hibernate
在持久化一个
News
对象时
,
由
Hibernate
负责生成主键值
.
hilo
标识符生成器在生成标识符时
,
需要读取并修改
HI_TABLE
表中的
NEXT_VALUE
值
.
•
适用范围
:
–
由于
hilo
生存标识符机制不依赖于底层数据库系统
,
因此它适合所有的数据库系统
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
native 标识符生成器
•
native
标识符生成器依据底层数据库对自动生成标识符的支持能力
,
来选择使用
identity,sequence
或
hilo
标识符生成器
.
•
适用范围
:
–
由于
native
能根据底层数据库系统的类型
,
自动选择合适的标识符生成器
,
因此很适合于跨数据库平台开发
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
Property
•
property
元素用于指定类的属性和表的字段的映射
–
name
:
指定该持久化类的属性的名字
–
column
:
指定与类的属性映射的表的字段名
.
如果没有设置该属性
,Hibernate
将直接使用类的属性名作为字段名
.
–
type
:
指定
Hibernate
映射类型
.Hibernate
映射类型是
Java
类型与
SQL
类型的桥梁
.
如果没有为某个属性显式设定映射类型
,Hibernate
会运用反射机制先识别出持久化类的特定属性的
Java
类型
,
然后自动使用与之对应的默认的
Hibernate
映射类型
.
–
not-null
:
若该属性值为
true,
表明不允许为
null,
默认为
false
–
access
:
指定
Hibernate
的默认的属性访问策略。默认值为
property,
即使用
getter,setter
方法来访问属性
.
若指定
field,
则
Hibernate
会忽略
getter/setter
方法
,
而通过反射访问成员
变量
–
unique
:
设置是否为该属性所映射的数据列添加唯一约束
.
•
property
元素用于指定类的属性和表的字段的
映射
–
index
:
指定一个字符串的索引名称
.
当系统需要
Hibernate
自动建表时
,
用于为该属性所映射的数据列创建索引
,
从而加快该数据列的查询
.
–
length
:
指定该属性所映射数据列的字段的长度
–
scale
:
指定该属性所映射数据列的小数位数
,
对
double,float, decimal
等类型的数据列有效
.
–
formula
:设置一个
SQL
表达式
,Hibernate
将根据它来计算出派生属性的值
.
–
派生属性
:
并不是持久化类的所有属性都直接和表的字段匹配
,
持久化类的有些属性的值必须在运行时通过计算才能得出来
,
这种属性称为派生属性
•
使用
formula
属性时
–
formula=“(
sql
)”
的英文括号不能少
–
Sql
表达式中的列名和表名都应该和数据库对应
,
而不是和持久化对象的属性对应
–
如果需要在
formula
属性中使用参数
,
这直接使用
wherecur.id=id
形式
,
其中
id
就是参数
,
和当前持久化对象的
id
属性对应的列的
id
值将作为参数传入
.
-update 可以使值不被修改
Java 类型,Hibernate映射类型及 SQL类型之间的对应关系
-update 可以使值不被修改
Java 类型,Hibernate映射类型及 SQL类型之间的对应关系
Java 时间和日期类型的Hibernate映射
•
在
Java
中
,
代表时间和日期的类型包括
:
java.util.Date
和
java.util.Calendar
.
此外
,
在
JDBCAPI
中还提供了
3
个扩展了
java.util.Date
类的子类
:
java.sql.Date
,
java.sql.Time
和
java.sql.Timestamp
,
这三个类分别和标准
SQL
类型中的
DATE,TIME
和
TIMESTAMP
类型对应
•
在标准
SQL
中
,DATE
类型表示日期
,TIME
类型表示时间
,TIMESTAMP
类型表示时间戳
,
同时包含日期和时间信息
.
如何映射java.util.Date为DATE,TIME TIMESTAMP
可以通过property的type属性来设置
使用 Hibernate内置映射类型
•
以下情况下必须显式指定
Hibernate
映射类型
–
一个
Java
类型可能对应多个
Hibernate
映射类型
.
例如
:
如果持久化类的属性为
java.util.Date
类型
,
对应的
Hibernate
映射类型可以是
date,time
或
timestamp.
此时必须根据对应的数据表的字段的
SQL
类型
,
来确定
Hibernate
映射类型
.
如果字段为
DATE
类型
,
那么
Hibernate
映射类型为
date;
如果字段为
TIME
类型
,
那么
Hibernate
映射类型为
time;
如果字段为
TIMESTATMP
类型
,
那么
Hibernate
映射类型为
timestamp.
•
Java
大对象类型的
Hiberante
映射
•
在
Java
中
,
java.lang.String
可用于表示
长字符串
(
长度超过
255),
字节
数组
byte[]
可用于存放图片或文件的
二进制数据
.
此外
,
在
JDBCAPI
中还提供了
java.sql.Clob
和
java.sql.Blob
类型
,
它们分别和标准
SQL
中的
CLOB
和
BLOB
类型对应
.CLOB
表示字符串大对象
(CharacterLarge Object), BLOB
表示二进制对象
(BinaryLarge Object)
•
•
•
Mysql
不支持标准
SQL
的
CLOB
类型
,
在
Mysql
中
,
用
TEXT,MEDIUMTEXT
及
LONGTEXT
类型来表示长度操作
255
的长文本数据
•
在持久化类中
,
二进制大对象可以声明为
byte[]
或
java.sql.Blob
类型
;
字符串可以声明为
java.lang.String
或
java.sql.Clob
•
实际上在
Java
应用程序中处理长度超过
255
的字符串
,
使用
java.lang.String
比
java.sql.Clob
更方便
sql-type:精准映射字段的类型
获取blob的方法: Hibernate.getLobCreator(session).createBlob(stream,stream.available());
映射组成关系
•
建立域模型和关系数据模型有着不同的出发点
:
–
域模型
:
由程序代码组成
,
通过细化持久化类的的粒度可提高代码的可重用性
,
简化编程
–
–
在没有数据冗余的情况下
,
应该尽可能减少表的数目
,
简化表之间的参照关系
,
以便提高数据的访问速度
•
映射组成关系
component
映射组成关系
•
Hibernate
把持久化类的属性分为两种
:
–
值
(value)
类型
:
没有
OID
,
不能被单独持久化
,
生命周期依赖于所属的持久化类的对象的生命周期
–
实体
(entity)
类型
:
有
OID,
可以被单独持久化
,
有独立的生命周期
•
显然无法直接用
property
映射
pay
属性
•
Hibernate
使用
<component>
元素来映射组成关系
,
该元素表名
pay
属性是
Worker
类一个组成部分
,
在
Hibernate
中称之为
组件
•
<component>
元素来映射组成关系
–
class:
设定组成关系属性的类型
,
此处表明
pay
属性为
Pay
类型
•
<
parent
>元素
指定组件属性所属的整体类
–
name:
整体类在组件类中的属性名