Hibernate之深入Hibernate的映射文件
这周周末 要把hibernate的映射文件搞定 。。
1.映射文件的主结构
主要结构 :根元素为<hibernate-mapping ></hibernate-mapping> 该元素下可以拥有多个<class></class>元素,每一个<class>元素代表一个持久化类的映射。
<hibernate-mapping>
<class ></class>
<class></class>
.......
</hibernate-mapping>
其中<hibernate-mapping>元素支持如下属性 :
schema:
catalog:
default-access: 指定hibernate默认的属性访问策略 ,默认值是property ,即通过getter方法和setter方法来访问持久化类的属性(Field)
default-lazy: 指定hibernate的延迟加载策略 ,默认值是true ,即启用启用延迟加载策略。
auto-import: 指定hibernate是否使用非全限定类名 。默认值是true ,即可以使用非全限定的类名 (即不含报名)。
package: 该属性 指定一个默认的包名 ,对于没有使用全限定类名的 <class>映射块 ,则到指定的包中去找该类。
其中<class>元素支持如下属性:
<class>元素可是指定schema catalog default-access default-lazy auto-import package 属性来覆盖父元素<hibernate-mapping>中指定的值。
name属性 :指定要映射的持久化类的类名 建议是全限定类名(包名+类名),如果使用非全限定类名 则会到<hibernate-mapping>元素package属性,指定的包中去找该类。
table属性 :指定该持久化类 映射成的表名 。hibernate默认以持久化类的类名作为表名。
discriminator-value属性:指定区分不同子类的值
mutable属性 :指定 该持久化类的实例是可变对象还是不可变对象 。默认值是 true 不可变对象时 更新该对象 数据库表不更新 但是可以insert delete
proxy属性: 指定一个接口 (类),在延迟装载时作为代理使用。
dynamic-update属性: 没有更新的属性 对应的数据列 不会得到更新
dynamic-insert属性: 没有赋值的属性 对应的数据列 不会得到插入
select-before -update属性; 执行更新之间,是否先发起一条SQL查询 看看表中的数据 是否和持久化对象的属性值一致 如果不一致就更新 如果一致 就不更新
polymorphism属性:
where属性: 指定一个附加的SQL语句中的过滤条件 。 只有符合该where条件的记录才会被加载 出来
batchsize属性:指定根据标示符来抓取实例时每批抓取的实例数。默认值时 1
optimistic-lock属性 :指定乐观锁定策略 。默认值 是 version
check属性 :指定一个SQL表达式 ,用于为该持久化类所映射成的表 指定一个多行的 约束
subselect属性:
2.使用<class>元素映射持久化类
使用<class>元素映射某个持久化类时,通常需要<id>和<property>两个最常见的子元素。
<id>元素 映射表示标识属性(Field)
<property>元素 映射普通属性 如 String类型 Date类型 Integer类型 等普通属性
映射标识属性 : 使用<id>元素
一般情况,hibernate建议为持久化类定义一个标识属性,用于唯一的标识这个持久化类的一个实例 ,而标识属性需要映射到对应数据表的主键。
<id>元素有如下可选属性;
name属性 : 指定该持久化类的标识属性 如果不设置,则表明该持久化类没有标识属性 该标识属性映射为数据表的逻辑主键 (什么是逻辑主键 什么是物理主键??)
type属性 : 指定该标识属性的数据类型 建议使用全限定类名 如果不使用该属性,由hibernate自行判断标识属性的数据类型
column属性:指定标识属性所映射的数据表的列的列名。 如果不使用该属性,默认列名与标识属性名相同
access: 指定属性访问策略 ,默认值是property ,即通过getter方法和setter方法来标识属性
主键生成器 <generator>,常见主键生成策略:
assigned :让应用程序在save()一个对象之前,为这个对象分配一个标识符
native :让hibernate根据底层数据库的能力选择 identity sequence 或者hilo中的一个
identity: DB2,MySQL ,SQL Server 等数据库 提供的identity(自增长)主键生成策略 。 返回的标识属性是 long,short或int类型 (建议使用包装类)
sequence: DB2,Oracle,PostgreSQL 等数据库 提供的sequence主键生成策略 。 返回的标识属性是 long,short或int类型 (建议使用包装类)
hilo:
seqhilo :
uuid:
guid:
这样使用 :在<id>元素下 <generator class="native" />
映射普通属性: 使用<property>元素
<property>元素有以下可选属性 :
name属性 :指定持久化类的属性名
column属性 :指定持久化类的属性 映射到数据表中的列名 如果不写,默认列名为该属性名
type属性:指定该持久化类的普通属性的 类型 建议使用全限定类名 (类名+包名)
formula属性:
unique属性:设置是否为该属性所映射的数据列添加唯一约束
not-null属性:设置是否为该属性所映射的数据列添加非空约束
optimistic-lock属性:设置该属性在进行更新时是否需要使用乐观锁定
generated属性:
index属性:
unique-key属性:
length属性:
映射集合类型的属性:
一个持久化类拥有集合类型的属性也是非常常见的。
集合类型的属性大致有两种:第一种是单纯的集合类型属性,例如像List,Set或数组等。第二种是Map结构的集合类型属性。
Hibernate要求使用集合接口来声明 集合类型的属性。 所以可以用 Set接口,Collection接口,List接口,Map接口等,但不能使用ArrayList这样的实现类来声明属性。
两个持久化类的实例 的 集合类型属性 不能同时引用同一个集合对象。
集合类型属性的映射的元素有如下: 不再使用<property>
<array>元素 :用于映射数组类型的属性
<primitive-array>元素 :专门用于映射基本数据类型的数组
<list >元素 :用于映射List集合类型的属性
<set >元素 :用于映射Set集合类型的属性
<map >元素 :用于映射Map集合类型的属性
<bag>元素 :用于映射无序集合类型的属性
<idbag>元素:用于映射无序集合类型的属性 ,但为集合增加逻辑次序。
集合类型的属性 都是通过新建另外一张数据表 然后通过这张数据表的一列与 主数据表的 逻辑主键列建立主外键关联 其他列用于存储集合类型属性的值。
如 如下配置:
<array name="myArray" >
<key column="id"></key> //<key>元素会自动关联主数据表中的 逻辑主键列 column属性指定新生成的数据表的对应列名
<list-index column="indexVal"></list-index> //<list-index>元素 用于存储数组类型属性的 下标索引值 column属性指定新生成的数据表的对应列名
<element column="val" type="string"></element> //<element>元素 用于存储数组类型属性的 值 column属性指定新生成的数据表的对应列名
</array>
由于list集合的底层是数组 所以配置类似于数组的映射配置
<list name="myList">
<key column="id"></key>
<list-index column="indexVal"></list-index>
<element column="val" type="string"></element>
</list>
由于set集合 没有索引 所以在新建的数据表中不用存索引值
<set name="mySet">
<key column="id"></key>
<element column="val" type="string"></element>
</set>
由于map集合 相对于set集合 只是其中的每个数据对象 多了一个小尾巴 value
<map name="myMap">
<key column="id"></key>
<map-key column="mapKey" type="string"></map-key>
<element column="mapValue" type="string"></element>
</map>
映射组件属性
组件属性:通过组合的方式为持久类提供 另一个Java Bean类的 属性(Field)
Hibernate提供了 <component>元素来 映射组件属性 组件属性并不会想集合类型的属性那样 存放在另外一张新建的表中
而是把组件类的属性(基本类型,字符串,日期类型等)添加的映射到主数据表中的列
<component name="owner"> //name属性是 组件属性名
<property name="firstName" /> //name属性是 组件类的 属性名
<property name="lastName" /> //name属性是 组件类的 属性名
<list > // 组件类 的 属性是 list等集合类型属性时 会映射到另外一张表
</list >
<component> //组件类 中的属性 是一个组件组件属性时 可以嵌套 <component>元素
</component>
</component>
。。。。。
几种映射的特殊情况 :
集合类型的属性 中的元素是 一个组件类型 private List<Person> myList;
这种情况 需要在<list>元素中使用 <composite>元素
Map类型的属性 中的key是一个组件类型 private Map<Person , String> myMap;
使用组件属性 作为数据表的主键
多列作为联合主键
Hibernate之深入Hibernate的映射文件的更多相关文章
- Hibernate 5 入门指南-基于映射文件
由于Hibernate 4版本混乱,Hibernate 3有些过时,Hibernate 5的开发文档尚不完善,所以构建一份简单的Hibernate 5的入门指南 注:案例参考Hibernate 官方参 ...
- Hibernate *.hbm.xml对象关系映射文件详解
在hibernate中表与pojo对象是一一对应的,通过hbm文件将数据库表与实体关联起来,本文将对hbm文件进行介绍. pojo对象:提供了公共的无参构造方法 ,通过反射产生对象. ...
- 2018.11.1 Hibernate中的Mapper关系映射文件
Customer.hbm.xml 基本的参数都在里面了 <?xml version="1.0" encoding="UTF-8"?> <!DO ...
- Hibernate 配置文件与映射文件 总结
hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 一.Hibernate配置文件详解 Hibernate配置文件有两种形式:XML与p ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- hibernate.cfg.xml hibernate 配置文件模板
<?xml version='1.0' encoding='UTF-8'?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition ...
- hibernate篇章三-- hibernate配置文件hibernate.cfg.xml的详细解释
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...
- Hibernate复习之Hibernate基本介绍
众所周知.眼下流行的面向对象的对象关系映射的Java持久层框架有MyBatis和Hibernate.他们都是对象关系映射ORM. 解决的主要问题就是对象-关系的映射.域模型和关系模型都分别建立在概念模 ...
- Hibernate关联映射 映射文件的配置
一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; p ...
- hibernate映射文件
Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的.该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射.这意味着映射文档是按照持久化类的定义来创建 ...
随机推荐
- [LOJ2230][BJOI2014]大融合
题面戳我 sol LCT维护子树size. 开一个数组\(sz_i\)表示一个节点的所有虚儿子的size和,\(sum_i\)表示以一个节点为根的子树的\(size\)和,可见\(sz_u=\sum_ ...
- [BZOJ4195] [NOI2015] 程序自动分析 (并查集)
Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或x ...
- iOS开发——自定义转场动画
首先是UIPresentationController,这个控制器给modal新的viewController提供了下一步的view和转场的管理,从一个viewController被modal出来到被 ...
- 软件License认证方案的设计思路
销售license是商业软件的贯用商业模式.用户向商家购买软件安装盘搭载license许可,才可以使用该软件.我们作为软件开发者,为了保护自身的权益,在软件开发过程中也不可避免的会设计license管 ...
- CLOB型转成字符型
//oracle.sql.Clob类型转换成String类型 public static String ClobToString(Clob clob) { String reString = &quo ...
- 云计算之路-阿里云上:docker swarm 集群再次出现故障
非常非常抱歉!16:30 ~ 17:00 左右我们用于跑 ASP.NET Core 站点的 docker swarm 集群再次出现宕机,由此给您带来了很大很大的麻烦,恳请您的谅解! 受此次故障影响的站 ...
- 数据分析之Pandas和Numpy学习笔记(持续更新)<1>
pandas and numpy notebook 最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...
- python实现一般最小二乘系统辨识方法
问题: 对于一个未知参数的系统,往往需要用到系统辨识的方法,例如对于一个单输入单输出系统: Z(k)+a1*Z(k-1)+a2*Z(k-2)=b1*U(k-1)+b2*U(k-2)+V(k) 其中:V ...
- Jenkins 部署 jmeter + Ant
安装Jenkins: 到jenkins官网下载相应的jenkins版本: 双击jenkins.msi启动安装,安装目录选择D:\Progrom Files\Jenkins,然后启动成功. Jenkin ...
- 深入java虚拟机学习 -- 内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...