Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的。该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射。这意味着映射文档是按照持久化类的定义来创建的,而不是表的定义。
一、根元素
每一个hbm.xml文件都有唯一的一个根元素,包含一些可选的属性:
1).package
指定一个包前缀,如果在映射文档中没有明确写出完整的包全名的类,会默认使用这个作为包名做前缀
(2).schema
指定当前映射文件对应的数据库表的schema名
(3).catalog
指定当前映射文件对应的数据库表的catalog名
(4).default-cascade
设置默认的级联方式(默认值为none)
(5).default-access
设置默认的属性访问方式(默认值为property)
(6).default-lazy
设置对没有指定配置是否延迟加载映射类和集合设定是否默认延迟加载(默认值为true)
(7).auto-import
设置当前映射文件中是否可以在HQL中使用非完整的类名(默认值为true)
(8).sql-query
定义一个SQL查询
(9).filter-def
指定过滤器
二、定义类
根元素的子元素,用以定义一个持久化类与数据表的映射关系,如下是该元素包含的一些可选的属性。
(1).name
为当前映射文件指定对应的持久类名,没有package要求包全名
(2).table
为当前映射文件指定对应的数据库表名
(3).schema
设置当前指定的持久类对应的数据库表的schema名
(4).catalog
设置当前指定的持久类对应的数据库表的catalog名
(5).lazy
设置是否使用延迟加载
(6).batch-size
设置批量操作记录的数目(默认值为1)
(7).check
指定一个SQL语句用于Schema前的条件检查
(8).where
指定一个附加的SQL语句的where条件
(9).rowid
指定是否支持ROWID
(10).entity-name
实体名称,默认值为类名
(11).subselect
将不可变的只读实体映射到数据库的子查询中
(12).dynamic-update
指定用于update的SQL语句是否动态生成 默认值为false
(13).dynamic-insert
指定用于insert的SQL语句是否动态生成 默认值为false
(14).insert-before-update
设定在Hibernate执行update之前是否通过select语句来确定对象是否确实被修改了,如果该对象的值没有改变,update语句将不会被执行(默认值为false)
(15).abstract
用于在联合子类中标识抽象的超类(默认值为false)
(16).emutable
表明该类的实例是否是可变的 默认值为fals
(17).proxy
指定延迟加载代理类
(18).polymorphism
指定使用多态查询的方式 默认值为implicit
(19).persister
指定一个Persister类
(20).discriminator-value
子类识别标识 默认值为类名
(21).optimistic-lock
指定乐观锁定的策略 默认值为vesion
(22).natural-id
声明一个唯一的业务主键
(23).join
将一个类的属性映射到多张表中
(24).sub-class
声明多态映射中的子类
(25).joined-subclass
生命多态映射中的来连接子类
(26).union-subclass
声明多态映射中的联合子类
(27).loader
定义持久化对象的加载器
(28).filter
定义Hibernate使用的过滤器
(29).component
定义组件映射
(30).dynamic-component
定义动态组件映射
(31).properties
定义一个包含多个属性的逻辑分组
(32).cache
定义缓存的策略
(33).discriminator
定义一个鉴别器
(34).meta
设置类或属性的元数据属性
(35).timestamp
指定表中包含时间戳的数据
(36).vesion
指定表所包含的附带版本信息的数据
三、定义主键
Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。
(1).name
指定当前映射对应的持久类的主键名
(2).column
指定当前映射对应的数据库表中的主键名(默认值为对应持久类的属性名)
(3).type
指定当前映射对应的数据库表中的主键的数据类型
(4).unsaved-value
判断此对象是否进行了保存
(5).daccess
Hibernate访问主键属性的策略(默认值为property)
四、generator节点的属性
(1).class
指定主键生成器,id作为主键的生成策略: 前面详细讲过,这里不说了!
(2).name
指定当前映射对应的持久类的主键名
(3).column
指定当前映射对应的数据库表中的主键名(默认为对应持久类的主键名)
(4).type
指定当前映射对应的数据库中主键的数据类型
(5).unique
设置该字段的值是否唯一(默认值为false)
(6).not-null
设置该字段的值是否可以为null(默认值为false)
(7).update
设置update操作时是否包含本字段的数据(默认值为true)
(8).insert
设置insert操作时是否包含本字段的数据(默认值为true)
(9).formula
设置查询操作时该属性的值用指定的SQL来计算
(10).access
Hibernate访问这个属性的策略(默认值为property)
(11).lazy
设置该字段是否采用延迟加载策略(默认值为false)
(12).optimistic-lock
指定此属性做更新操作时是否需要乐观锁定(默认值为true)
五、property节点的属性
用于持久化类的属性与数据库表字段之间的映射,包含如下属性:
(1)name
持久化类的属性名,以小写字母开头
(2)column
数据库表的字段名,也就是可以将子节点中的column标签提到属性上
(3)type
Hibernate映射类型的名字,这个类型是Java里的POJO里的属性类型和Hibernate自己内部的映射类型和数据库里表格的字段类型链接纽带,具体设置来讲可以设置java的类型(一般使用这个,自动生成也是这个),也可以写hibernate内部的映射类型(需要特别类型的时候,必须只要日期不要时间):

日期时间类型:
在java中日期时间类型: java.util.Date, java.util.Calendar
在JDBC的API中扩展里java.util.Date类:
java
java.sql.Date, java.sql.Time,java.sql.Timestamp
分别对应数据库中:
DATE, TIME, TIMESTAMP

大对象映射:

但是,有时候,不是很精准,这个时候我们可以用sql-type属性做精准的类型映射。
(4).formula
设置当前节点对应的持久类中的属性的值由指定的SQL从数据库获取,主要用在派生属性上面,这个配置里有里formula就不要在配置column了
注:指定的SQL必须用()括起来,指定SQL中使用表里的列名时必须用表的别名加.加列名的方式访问,但如果指定SQL中要使用当前映射对应的列名时不能用表的别名加.加列名的方式访问,而是直接访问即可 。
(5).unique
设置该字段的值是否唯一(默认值为false)
(6).not-null
设置该字段的值是否可以为null(默认值为false)
(7).not-found
设置当当前节点对应的数据库字段为外键时引用的数据不存在时如何让处理(默认值为exception:产生异常,可选值为ignore:对不存在的应用关联到null)
(8).property-ref
设置关联类的属性名,此属性和本类的关联相对应 默认值为关联类的主键
(9).entity-name
被关联类的实体名
(10).lazy
指定是否采用延迟加载及加载策略(默认值为proxy:通过代理进行关联,可选值为true:此对象采用延迟加载并在变量第一次被访问时抓取、false:此关联对象不采用延迟加载)
(11).access
Hibernate访问这个属性的策略(默认值为property),所有的访问策略具体的, 值是property,Hibernate获取model实体类(POJO类/持久化类)的属性值时使用getter、setter方法,如果设置为field,则Hibernate会忽略getter和setter方法,直接用反射的方式访问成员变量的值
(12).optimistic-lock
指定此属性做更新操作时是否需要乐观锁定(默认值为true)
(13).length
指定数据类型的长度,并不是都指数据的大小, 数据的大小只和数据类型有关。具体说就是:
CHAR、VARCAHR的长度是指字符的长度,例如CHAR[3]则只能放字符串"123",如果插入数据"1234",则从高位截取,变为"123"。 VARCAHR同理。
TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT的长度,其实和数据的大小无关!Length指的是显示宽度,如id的显示宽度为3,不足的左边补0,数据长度超过的则原样输出
FLOAT、DOUBLE和DECIMAL的长度指的是全部数位(包括小数点后面的),例如DECIMAL(4,1)指的是全部位数为4,小数点后1位,如果插入1234,则查询的数据是999.9。
但是注意: Hibernate内部有限制机制,它是不允许插入数据库的数据超出类型长度的!超出了Hibernate会报异常!
(14).update
设置执行update的sql语句的时候,这个字段会不会被修改! false的话,修改操作对数据库失效,这个字段的值不允许修改!
(15).index
设置数据库中该字段的索引
很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。
如果我们对某一字段增加索引,查询时就会先去索引列表中定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。