Hibernate之对象关系映射文件
一、对象关系映射文件
POJO类和关系数据库之间的映射可以用一个XML文档来定义
在运行时Hibernate将根据这个映射文件来生成各种SQL语句
映射文件的拓展名为 .hbm.xml
1.映射文件说明
<hibernate-mapping>
<class name="com.yfy.hibernate.entity.NewsEntity" table="news" schema="hibernate" dynamic-insert="true" dynamic-update="true" ><id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id><property name="title" column="title"/><property name="author" column="author"/><property name="data" column="data"/></class>
</hibernate-mapping>
hibernate-mapping
类层次:class
主键:id
基本类型:property
实体引用类:many-to-one | one-to-one
集合:set | list | map | array
one-to-many | many-to-many
子类:subclass | joined-subclass
其它:component | any等
查询语句:query
每个hibernate-mapping可以同时定义多个类,但推荐为每个类都创建一个单独的映射文件
(1)hibernate-mapping
Hibernate-mapping是hibernate映射文件的根元素
schema:指定所映射的数据库schema的名称。若指定该属性,则表明会自动添加该schema前缀
select * from 数据库名.表名
catalog:指定所映射的数据库catalog的名称
default-cascade(默认:none):设置Hibernate默认的级联分格
default-access(默认:property):指定Hibernate的默认属性访问策略。property会使用getter、setter方法访问属性,若指定access,则会通过反射访问成员变量
default-lazy(默认:true):默认启用延迟加载策略
auto-import(默认:true):指定是否可以在查询语句中使用非全限定的类名
package:指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名
(2)class属性
class元素用于指定类和表的映射
name:指定该持久化类的类名
table:指定该持久化类映射的表名
dynamic-insert(默认:false):若设置为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段
NewsEntity newsEntity = new NewsEntity();newsEntity.setTitle("hibernate入门");newsEntity.setData(new Date());session.save(newsEntity); //title为null,不会插入title sql语句:Hibernate: insert intohibernate.news(title, data) values(?, ?)
dynamic-update(默认:false):若设置为true,表示当更新一个对象时,会动态生成update语句,update语句中仅包含所有取值需要更新的字段
NewsEntity newsEntity = (NewsEntity)session.get(NewsEntity.class, 20);newsEntity.setAuthor("java23");newsEntity.setData(new Date());session.update(newsEntity); //title没有改变,author和之前一样updatehibernate.news setdata=? whereid=?
batch-size:指定根据OID来抓取实例时每批抓取的例数
lazy:指定是否使用延迟加载
multable(默认:true):若设置为false,等价于所有的property元素的update属性为false,表示整个实例不能被更新,默认为true
(3)映射对象标识符
Hibernate使用对象标识符(OID)来建立内存中的对象和数据表中记录的对应关系。对象的OID和数据表的主键对应,Hibernate通过标识符生成器来为主键赋值
Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型要比字符串类型节省更多的数据库空间
在映射文件中,<id>元素用来设置对象标识符,<generator>子元素用来设定标识符生成器
Hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现
(4)id
设定持久化类的OID和表的主键的映射
name:标识持久化类OID的属性名
column:设置标识属性所映射的数据表的列名
unsaved- value:若设定了该属性,Hibernate会通过比较持久化类的OID值和该属性值来区分当前持久化类的对象是否为临时对象
type:指定Hibernate映射类型
注意:Hibernate映射类型,基本数据类型无法表达null,所以对于持久化类的OID推荐使用包装类型
<id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id>
(5)generator
设定持久化类设定标识符生成器
主键生成策略
标识符生成器 | 描述 |
---|---|
increment | 由Hibernate以递增方式生成 |
identity | 由底层数据库生成标识符 |
sequence | 底层数据库的序列生成标识符,要求数据库支持序列 |
hilo | Hibernate分局high/low算法生成标识符 |
sequilo | 使用高/低位算法高效的生成long,short,int类型标识符 |
native | 根据底层数据库对自动生成标识符的方式,自动选择identity,sequence或hilo |
uuid.hex | 采用128位的UUID算法生成标识符 |
uuid.string | UUID被编码成一个16字符长的字符串 |
assigned | 由java应用程序负责生成标识符 |
foreign | 使用另外一个相关联的对象的标识符 |
increment:
Hibernate会先读取对应表中主键的最大值,接下来向表中插入记录时,就在max(id)的基础上递增,增量为1
适用范围:
适合所有的数据库系统
适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用
OID必须为long,int或short类型
identity:
要求底层数据库把主键定义为自动增长类型
适用范围:
支持自动增长字段类型的数据库:DB2,Mysql,MSSQLServer,Sybase等
OID必须为long,int或short类型
sequence:
在持久化一个对象时,先从底层数据库的序列中获得一个唯一的标识号,再把它作为主键值
适用范围:
支持序列的数据库:DB2,Oracle等
OID必须为long,int或short类型
hilo:
按照一种high/low算法生成标识符,它从数据库的特定表的字段中获取high值
<id name="id"><generator class="hilo"><param name="table">hl_table</param><param name="column">next_value</param><!-- 每次增加的id(默认为0) 1/12/23 --><param name="max_lo">10</param></generator>
</id>
native:
适用范围:
能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合与跨数据库平台开发
OID必须为long,int或short类型
(6)Property
property元素用于指定类的属性和表的字段的映射
name:指定该持久化类的属性的名字
column:指定与类的属性映射的表的字段名,如果没有设置该属性,将直接使用类的属性名作为字段名
type:指定Hibernate映射类型
not-null:若该属性为true,表名不允许为null,默认为false
access:指定Hibernate的默认的属性访问策略。默认为property,若指定filed,则通过反射访问成员变量
unique:设置是否为该属性所映射的数据列添加唯一约束
index:指定一个字符串的索引名称
<property name="author" type="java.lang.String" index="news_index"><column name="AUTHOR" /></property>
length:指定该属性所映射数据列的字段的长度
scale:指定该属性锁映射数据列的小树数位
formula:设置一个SQL表达式,Hibernate将根据它来计算出派生属性的值
formula="sql"
sql表达式中的列名和表名都应该和数据库对应,而不是和持久化对象的属性对应
如果需要在formula属性中使用参数,直接使用 where cur.id=id形式,其中id就是参数,和当前持久化对象的id属性对应的列的id值将被作为参数传入
<!-- 映射派生属性 --><property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property>
(7)java类型与SQL类型之间的对应关系
Hibernate映射类型 | Java类型 | SQL类型 | 大小 |
---|---|---|---|
integer/int | java.lang.Integer/int | integer | 4字节 |
long | java.lang.Long/long | bigint | 8字节 |
short | java.lang.Short/short | smallint | 2字节 |
byte | java.lang.Byte/byte | tinyint | 1字节 |
float | java.lang.Float/float | float | 4字节 |
double | java.lang.Double/double | double | 6字节 |
big_decimal | java.math.BigDecimal | mumeric | |
character | java.lang.Character/char | char(1) | 定长字符 |
string | java.lang.String | varchar | 变长字符 |
boolean | java.lang.Boolean/boolean | bit | 布尔类型 |
date | java.util.Date/java.sql.Date | date | 日期 |
timestamp | java.util.Date/java.sql.Timestamp | timestamp | 日期 |
calandar | java.util.Calendar | timestamp | 日期 |
calandar_date | java.util.Calendar | date | 日期 |
binary | byte[] | blob | blob |
text | java.lang.String | text | clob |
serializable | 实现java.io.Serializable接口的类 | blob | blob |
clob | java.sql.Clob | clob | clob |
blob | java.sql.Blob | blob | blob |
class | java.lang.Class | varchar | 定长字符 |
locale | java.util.Locale | varchar | 定长字符 |
timezone | java.util.TimeZone | varchar | 定长字符 |
currency | java.util.Currency | varchar | 定长字符 |
以下情况下必须显示指定Hibernate映射类型
一个Java类型可能对应多个Hibernate映射类型。例如:如果持久化类的属性为java.util.Date类型,对应的Hibernate映射类型可以是date,time或timestamp。此时必须根据对应的数据表的字段的SQL类型,来确定Hibernate映射类型
java大对象的Hibernate映射
java中,提供了Clob和Blob类型,对应SQL中的CLOB和BLOB类型。CLOB表示字符串大对象,BLOB表示二进制对象
Mysql不支持标准SQL的CLOB类型,在Mysql中,用text,mediumtext及longtext类型表示长文本数据
实际上在Java中处理长度超过255的字符串,使用String更方便
<!-- 映射大对象 --><!-- 若希望精确映射 SQL 类型, 可以使用 sql-type 属性. --><property name="content"><column name="CONTENT" sql-type="mediumtext"></column></property><property name="image"><column name="IMAGE" sql-type="mediumblob"></column>
Hibernate之对象关系映射文件相关推荐
- Hibernate - 对象关系映射文件(*.hbm.xml)详解
对象关系映射文件,即POJO 类和数据库的映射文件*.hbm.xml(映射文件的扩展名为 .hbm.xml). POJO 类和关系数据库之间的映射可以用一个XML文档来定义. 通过 POJO 类的数据 ...
- Hibernate之对象关系映射
一.一对多关联关系 1.单向n-1 单向n-1关联只需从n的一端可以访问1的一端 Hibernate使用<many-to-one>元素来映射多对一关联关系 <!-- 映射多对一的关联 ...
- Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射
回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表.实体间存在三种关系,一对一,一对多(或者说多对一),多对多.而如今 ...
- Hibernate对象关系映射详解之一对多关系映射
Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...
- netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)
netsuite 数据集成 对象关系映射(ORM)技术使使用关系数据源更加容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将NetSuite数据的连接集成到基于Java的ORM框架 ...
- Java中带有NetSuite数据实体的对象关系映射(ORM)
对象关系映射(ORM)技术使使用关系数据源更容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将与NetSuite数据的连接集成到基于Java的ORM框架Hibernate中. 您可 ...
- 【分享】关于对象关系映射的理解
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据 ...
- C++ 对象关系映射(ORM)介绍
用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis),TopLink,JDO,JPA-- ...
- 学习笔记之什么是持久化和对象关系映射ORM技术
----------------本文转自:http://www.cppblog.com/javenstudio/articles/541.html--------------------- 何谓&qu ...
最新文章
- 图像边缘检测之拉普拉斯(Laplacian)C++实现
- [转]json2.js 源码解读
- php curl 防止采集,php多线程采集网页的解决办法 curl多线程采集
- linux-shell命令之mkdir(make dir)【创建目录】
- 关于Java和Scala同步的五件事你不知道
- 潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)...
- 【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢
- Wireshark和TcpDump抓包分析心得
- Python异常处理 -跳过异常继续执行
- kubernetes资源--RC和RS
- MySQL – iBatis – 文件存储
- 苹果7信号天线内部位置_苹果7信号天线内部位置_除了芯片还有天线!手机后壳换玻璃也是为5G准备...
- 计算x的n次方 高效算法
- Coursera吴恩达机器学习week4笔记
- 可爱的树链剖分(染色)
- Windows 8寄托着微软对移动计算、客厅控制和超级操作系统的全新理解与尝试
- selenium爬虫浏览器驱动怎么安装,找不到urs/local/bin文件夹
- 金融科技的下一战场:从金融普惠到技术普惠
- HDU 1.3.7 悼念512汶川大地震遇难同胞——老人是真饿了
- MediaInfo使用简介
热门文章
- 现代密码学3.4--CPA安全,多次加密
- 为什么 Kafka 如此之快?
- 关于UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xa6 in position 9737: 的解决
- [TT]-Trustonic acronyms
- optee userpace TA程序中的栈的设置
- mysql命令导入导出数据_mysql命令行导入和导出数据
- (10)调用门提权(无参数)
- Linux提权CVE-2022-0847分析
- 1.3 Java二维数组详解
- C++学生信息管理系统V1(课后作业)