Hibernate的映射关系的基本配置

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语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。

如果我们对某一字段增加索引,查询时就会先去索引列表中定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。

相关推荐
wuqingshun3141594 分钟前
经典算法 判断一个图中是否有环
java·开发语言·数据结构·c++·算法·蓝桥杯·深度优先
神仙别闹8 分钟前
基于JSP+MySQL实现用户注册登录及短信发送功能
java·开发语言·mysql
code喵喵16 分钟前
架构设计系列
java
陳長生.41 分钟前
JAVA EE_初始网络原理
java·开发语言·网络·java-ee
菜鸟起航ing1 小时前
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识
java·spring boot·微服务·性能优化·分布式事务
其实你热情似火1 小时前
Java基础第20天-JDBC
java·数据库·oracle
观无1 小时前
基于AOP+Log4Net+AutoFac日志框架
java·大数据·数据库
Java中文社群1 小时前
SpringAI版本更新:向量数据库不可用的解决方案!
java·人工智能·后端
王磊鑫2 小时前
重返JAVA之路——图书管理系统
java·开发语言
听闻风很好吃2 小时前
Java设计模式之观察者模式:从入门到架构级实践
java·观察者模式·设计模式