这周周末 要把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的映射文件的更多相关文章

  1. Hibernate 5 入门指南-基于映射文件

    由于Hibernate 4版本混乱,Hibernate 3有些过时,Hibernate 5的开发文档尚不完善,所以构建一份简单的Hibernate 5的入门指南 注:案例参考Hibernate 官方参 ...

  2. Hibernate *.hbm.xml对象关系映射文件详解

    在hibernate中表与pojo对象是一一对应的,通过hbm文件将数据库表与实体关联起来,本文将对hbm文件进行介绍. pojo对象:提供了公共的无参构造方法 ,通过反射产生对象.          ...

  3. 2018.11.1 Hibernate中的Mapper关系映射文件

    Customer.hbm.xml 基本的参数都在里面了 <?xml version="1.0" encoding="UTF-8"?> <!DO ...

  4. Hibernate 配置文件与映射文件 总结

    hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 一.Hibernate配置文件详解 Hibernate配置文件有两种形式:XML与p ...

  5. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  6. hibernate.cfg.xml hibernate 配置文件模板

    <?xml version='1.0' encoding='UTF-8'?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition ...

  7. hibernate篇章三-- hibernate配置文件hibernate.cfg.xml的详细解释

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  8. Hibernate复习之Hibernate基本介绍

    众所周知.眼下流行的面向对象的对象关系映射的Java持久层框架有MyBatis和Hibernate.他们都是对象关系映射ORM. 解决的主要问题就是对象-关系的映射.域模型和关系模型都分别建立在概念模 ...

  9. Hibernate关联映射 映射文件的配置

    一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; p ...

  10. hibernate映射文件

    Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的.该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射.这意味着映射文档是按照持久化类的定义来创建 ...

随机推荐

  1. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

  2. [Luogu3242][HNOI2015]接水果

    Luogu 我今天做两道整体二分结果全都是BZOJ权限题??? sol 我们抓住"盘子的路径是水果的路径的子路径"这个条件. 考虑每一个盘子路径\((u,v)\),讨论它可以作为哪 ...

  3. 论文笔记(6):Weakly-and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation

    这篇文章的主要贡献点在于: 1.实验证明仅仅利用图像整体的弱标签很难训练出很好的分割模型: 2.可以利用bounding box来进行训练,并且得到了较好的结果,这样可以代替用pixel-level训 ...

  4. MySQL的sum()函数

    如下图,这是一个关于用户参加活动,每个活动会给这位用户评分的一个表: 用户1参加了A活动,评分100: 用户2参加了B活动,评分98,又参加了D活动,评分10: 用户3参加了C活动,评分99 需求:把 ...

  5. Chrome 浏览器各版本下载大全【转载】

    随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...

  6. LINUX下解决TIME_WAIT等网络问题

    修改配置文件 /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout ...

  7. webapi下的web请求

    先看webapi提供的服务: [HttpPost] public ResultBaseModel SiteList(SiteModel param) { ResultBaseModel resultM ...

  8. Windows Live Writer介绍及相关问题解决

    今天本来想说更新一篇我的文章,更新的过程中添加了很多的内容,里面的图片太多了,导致我浏览器占用的内存不断增大,浏览器变得很卡,最后过了好久我终于更新完文章打算保存的时候居然卡住,然后所有我更新的文字和 ...

  9. Wp-UserAgent——让WordPress在评论后面加上浏览器和操作系统信息

    在很多的博客网站都看到过在评论的后面显示了浏览器和操作系统的信息,网上也用过一些插件,但是都不是很好看,有一次在一个网页上看见了这个评论后面不仅显示了浏览器和操作系统的图片,还有文字信息, 感觉不错, ...

  10. Unity程序们经常用到的网址(方便自己用,一直更新)

    浏览器收藏夹不好用,那就整理到这里吧 官方 API查询: https://docs.unity3d.com/ScriptReference/index.html 文档查询:https://docs.u ...