Hibernate —— Entity.hbm.xml
一、简述
1.对象关系映射文件,用于映射实体类和关系数据库数据表之间的一个 xml 文件。
2.通过 Entity.hbm.xml 映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据表列之间的对应关系。
3.映射主键、映射关联关系。
二、各个节点
<hibernate-mapping>
<class>
<id></id>
<property name=""></property>
<many-to-one name=""></many-to-one>
<one-to-one name=""></one-to-one>
<set name="">
<key></key>
<one-to-many></one-to-many>
<many-to-many></many-to-many>
</set>
<subclass></subclass>
<joined-subclass>
<key></key>
</joined-subclass>
<component name=""></component>
<any id-type="" name="">
<column name=""></column>
<column name=""></column>
</any>
</class>
</hibernate-mapping>
说明:在一个 Entity.hbm.xml 可以定义多个 class 节点,但是通常情况下只定义一个。
1.<hibernate-mapping>

(1)package
如果 hibernate-mapping 节点内存在多个 class 节点,可以通过这个属性来简化开发。相当于一个命名空间。
单个 class 节点的情况下:
<hibernate-mapping >
<class name="com.nucsoft.hibernate.News" table="news" schema="hibernate">
</class>
</hibernate-mapping>
多个 class 节点的情况下:
<hibernate-mapping package="com.nucsoft.hibernate">
<class name="News" table="news" schema="hibernate">
</class>
<class name="Users" table="users" schema="hibernate">
</class>
</hibernate-mapping>
2.<class>

(1)name:类名,如 com.nucsoft.hibernate.News。
(2)table:表明,如 news。类名和表名不一定一致。
(3)schema:库名。如 hibernate 。
(4)dynamic-insert:动态插入。默认为 false。若设置为 true,表示当插入一个对象时,会动态生成 insert 语句,insert 语句仅包含所有取值不为 null 的字段。
①默认
@Test
public void testDynamicInsert() {
News news = new News("bb", null, new java.util.Date());
session.save(news);
}
控制台打印:
Hibernate:
insert
into
hibernate.news
(title, author, date)
values
(?, ?, ?)
②设置 dynamic-insert="true"
@Test
public void testDynamicInsert() {
News news = new News("cc", null, new java.util.Date());
session.save(news);
}
控制台打印:
Hibernate:
insert
into
hibernate.news
(title, date)
values
(?, ?)
注意:设置为 null 的字段不存在 非空约束。
(5)dynamic-update:动态更新。默认为 false。若设置为 true,表示当更新一个对象时,会动态生成 update 语句,update 语句中仅包含所有取值需要更新的字段。
①默认
@Test
public void testDynamicUpdate() {
News news = (News) session.get(News.class, 205);
news.setAuthor("BB");
}
控制台打印:
Hibernate:
update
hibernate.news
set
title=?,
author=?,
date=?
where
id=?
②设置 dynamic-update="true"
@Test
public void testDynamicUpdate() {
News news = (News) session.get(News.class, 206);
news.setAuthor("CC");
}
控制台打印:
Hibernate:
update
hibernate.news
set
author=?
where
id=?
(6)select-before-update:设置某个持久化对象在更新前是否执行一次查询。如,对一个游离对象的更新,再更新前先查询使游离对象变为持久化对象,
若该对象和数据库中对应记录状态一致,则不再发送 UPDATE 语句。但是会影响性能。
3.<id>

说明:
- Hibernate 通过 OID 来建立内存中的对象和数据表中记录的对应关系。对象的 OID 和数据表的主键对应。Hibernate 通过标识符生成器来为主键赋值。
- Hibernate 推荐在数据表中使用代理主键,即不具备任何业务含义的字段。代理主键通常为整型。
- <id> 节点用来设置对象标识符,<generator> 子元素用来设定标识符生成器。Hibernate 提供了标识符生成器接口:IdentifierGenerator,提供了内置的实现,我们也可以通过实现这个接口来定义我们自己的生成器。
(1)name:持久化类的属性名。
(2)column:对应数据表的列名。
(3)type:Hibernate 的映射类型。
(4)unsaved-value:如果存在一个对象的 id 和 unsaved-value 值相同,会被认为成一个临时对象。
(4)子节点:<generator>。为持久化类设定标识符生成器。
- class 属性,生成器的全限定类名或缩写。一般使用缩写。

- increment:会存在并发问题,会出现主键重复。只适用于测试。
- hilo:在Hibernate 4.2.2 版本中,已过时。org.hibernate.id.enhanced.SequenceStyleGenerator 替代了它。
4.<property>

(1)name:指定该持久化类的属性名称。
(2)type:Hibernate 映射类型。(Hibernate 映射类型,是 Java 类型和 SQL 类型的桥梁)
(3)column:指定映射的表的字段名,可以定义为子节点的形式。
(4)access:指定 Hibernate 的默认的属性访问策略。默认为 property,即使用 getter/setter。若指定 field,则通过反射来访问成员变量。
(5)unique:是否添加一个唯一约束。
(6)update:这一列的值是否可以被修改。
(7)index:指定一个索引名称。
(8)scale:指定该属性所映射数据列的小数位。对 double/float/decimal 等有效。
(9)formula:设置一个 Sql 表达式,Hibernate 将根据它来计算出派生属性的值。
注意:
- 派生属性:并不是持久化类的所有属性都直接和表的字段匹配,持久化类的有些属性的值必须在运行时才能计算出来。
- formula="(sql)" 括号不能少。
- sql 语句中的列名和表名应与数据库中的列名和表名对应,而不是和持久化类名和属性名对应。
e:在 News 中添加了 String 类型的 desc 字段。
News.hbm.xml 配置:
<property name="desc" formula="(SELECT concat(title, ': ', author) FROM news n WHERE n.id = id)"/>
测试:
@Test
public void testFormula() {
News news = (News) session.get(News.class, 1);
System.out.println(news.getDesc());
}
控制台打印:
Hibernate:
select
news0_.id as id1_0_0_,
news0_.title as title2_0_0_,
news0_.author as author3_0_0_,
news0_.date as date4_0_0_,
(SELECT
concat(news0_.title,
': ',
news0_.author)
FROM
news n
WHERE
n.id = news0_.id) as formula0_0_
from
hibernate.news news0_
where
news0_.id=?
dd: DD
可以发现,是以子查询的方式来设置派生属性的。
三、映射时间、日期类型
1.基础知识
(1)在 Java 中,代表日期和时间的类型有:java.util.Date 和 java.util.Calendar。此外,JDBC 提供了 3 个扩展:java.sql.Date、java.sql.Time、java.sql.Timestamp。
分别和标准 SQL 的 date 、time、timestamp 类型对应。
(2)在标准 SQL 中,DATE 类型表示日期,TIME 类型表示时间,TIMESTAMP 类型表示时间戳,同时包含日期和时间信息。
(3)因为 java.util.Date 是 java.sql.Date,java.sql.Time 和 java.sql.Timestamp 的父类,所以 java.util.Date 可以对应标准 SQL 的Date、Time、Timestamp 类型。
基于上述所说,可以将实体类的 Date 类型设置为 java.util.Date 类型。
(4)如何将 java.util.Date 映射为 Date,Time,Timestamp?
①在 Eclipse 下,是根据实体和映射文件去生成数据表。
可以通过 property 的 type 属性来进行映射。
例如:
<property name="date" type="timestamp">
<column name="DATE" />
</property> <property name="date" type="data">
<column name="DATE" />
</property> <property name="date" type="time">
<column name="DATE" />
</property>
其中 timestamp, date, time 既不是 Java 类型, 也不是标准 SQL 类型, 而是 hibernate 映射类型。
②在 Intellij Idea 下,是根据表去生成 Entity.hbm.xml 和实体类。
生成的实体日期类型为具体的 java.sql.date 或 java.sql.time 或 java.sql.timestamp。
这里需要对其更改为其父类:java.util.date。
经过测试发现,对应 property 的 type 属性写与不写都不会影响最终结果。如:
<property name="birthday">
<column name="birthday" sql-type="timestamp"/>
</property>
插入的结果也是带有日期和时间的时间戳。
③小结:在 Eclipse 下,必须要显式的指定 property 的 type 属性,来进行日期时间的精确映射。而在 Intellij Idea 下,需要将实体类的日期和时间类型改为 java.util.Date 类型。
(5)Java 类型、Hibernate 类型、标准 SQL 类型对应表

四、关于 Blob,Clob 这里不进行说明。在项目中处理二进制和大数据类型的对象很少通过 Blob和 Clob进行存储。
五、总结
介绍了实体类和数据表是如何映射的,主键是怎么生成的,是怎么映射的,属性和列是怎么映射的。也介绍了日期时间的映射。
Hibernate —— Entity.hbm.xml的更多相关文章
- hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)
绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...
- hibernate 关于hbm.xml编写的总结
在Hibernate中,各表的映射文件….hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具.本节简单的讲述一下这些配置文件的配置. 配置文件的基本结构 ...
- hibernate的.hbm.xml文件文件配置属性详解
一般.hbm.xml文件如下面: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "- ...
- hibernate(*.hbm.xml)中新添加的字段被标记为红色(找不到)的解决方法
首先得是以这个方式生成的bean和xml,配置好了数据源(这样才能让hibernate中的配置和mysql进行交互) https://www.cnblogs.com/kinome/p/10549969 ...
- Hibernate XXX.hbm.xml 里的class标签的 schema 属性解释
转自:https://blog.csdn.net/mym43210/article/details/30230173 1 <?xml version="1.0" encodi ...
- hibernate之.hbm.xml文件内容相关参数说明
1.<id> 表示主键,下面介绍主键的生成机制 Increment: 由hibernate自动以递增的方式生成表识符,每次增量为1 Identity:由底层数据库生成表识符.条件是数据库支 ...
- Hibernate JavaBean.hbm.xml配置
主键生成策略: hibernate中必须设置主键 <generator> 由数据库维护: identity:用于自动生成主键方式(没有自增主键的数据库不使用eg:oracle) seque ...
- Hibernate 的*.hbm.xml文件的填写技巧
================================================================================= 模板: <!-- ?属性,本类 ...
- 【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)
https://www.cnblogs.com/biehongli/p/6555994.html
随机推荐
- DES原理
1.DES的描述 为了建立适用于计算机系统的商用密码,美国商业部的国家标准局NBS于1973年5月和1974年8月两次发布通告,向社会征求密码算法.在征得的算法中,由IBM公司提出的算法lucifer ...
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
- DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)
前言: 趁着最近的休息时间,只能多勤快些:多写代码,多更新文章. 因为一旦投入新的工作,估计博客又会恢复到一年才产几篇的状态. 对于DBImport,因为用户的意见,增加了一个亮点功能,让软件B格升为 ...
- Nova PhoneGap框架 第七章 设备事件处理
我们的框架包含了几种设备事件的处理,目的是为了让我们的程序员更容易的完成代码.这些事件包括:回退键(Android)和横竖屏切换事件. 7.1 Android回退键 首先来说说回退键的事件处理.当用户 ...
- HTML和CSS经典布局2
如下图: 需求: 1. 如图 2. 可以从body标签开始. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xht ...
- [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧
不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...
- upload4j安全、高效、易用的java http文件上传框架
简介 upload4j是一款轻量级http文件上传框架,使用简单,实现高效,功能专一,摆脱传统http文件上传框架的繁琐. upload4j的诞生并不是为了解决所有上传需求,而是专注于基础通用需求. ...
- Module-Zero之组织单元(OU)管理【新增】
返回<Module Zero学习目录> 概览介绍 OrganizationUnit实体 OrganizationUnit管理者 公共用例 设置 概览介绍 组织单元(Organization ...
- Docker实践:运行Python应用
本文将使用fig应用编排实现一个python的计数器,并使用web展示. 阅读本文您需要具备以下知识: 1.了解Python 2.熟练Docker基础知识(包括Dockerfile语法) 3.了解Do ...
- Android开发学习之路-回调机制学习笔记
不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...