Hibernate4-4 对象关系映射文件
来源:互联网 发布:微博淘宝网页链接 编辑:程序博客网 时间:2024/05/11 11:30
Hibernate根据对象关系映射文件来理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表字段之间的对应关系,并在运行时生成各种SQL语句。
1. 映射文件根元素
2. class元素
3. 映射对象标识符(OID)
作用:与数据表主键对应,用于建立内存中的对象和数据库表中记录的对应关系,进而通过标识符生成器来为主键赋值。
**主键:**Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段;代理主键通常为整数类型,因其比字符串类型要节省更多的存储空间。
设置:在对象关系映射文件中,id元素用来设置对象标识符,generator子元素用来设置标识符生成器。
Hibernate提供了标识符生成器接口IdentifierGenerator,并提供了各种内置实现。
4. 标识符生成器
Hibernate提供的内置标识符生成器有:
4.1 increment标识符生成器
作用:由Hibernate以递增的方式为代理主键赋值。
**原理:**Hibernate先读取数据库表中主键的最大值(有并发问题),执行保存操作时即在最大值基础上递增1。
适用范围:
1). 数据库系统:不依赖于底层数据库系统,适用于所有数据库系统;
2). 单进程访问:适用只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用;
3). OID定义类型:必须为long、int或short类型,若定义为byte类型,在运行时会抛出异常。
4.2 identity标识符生成器
原理:由底层数据库来负责生成标识符, 要求底层数据库把主键定义为自动增长字段类型。
适用范围:
1). 数据库系统:支持自动增长字段类型的数据库,如DB2、MySQL、MSSQLServer、Sybase等;
2). OID定义类型:必须为long、int或short类型,若定义为byte类型,在运行时会抛出异常。
4.3 sequence标识符生成器
作用:利用底层数据库提供的序列来生成标识符。
原理: Hibernate在持久化对象时,先从所指定的底层数据库序列中获得唯一的标识号,在将其作为主键值。
适用范围:
1). 数据库系统:支持序列的底层数据库,如DB2、Oracle等;
2). OID定义类型:必须为long、int或short类型,若定义为byte类型,在运行时会抛出异常。
<!-- 利用底层数据库提供的 news_seq 序列来生成标识符 --><id name="id"> <generator class="sequence"> <param name="sequence">news_seq</param> </generator></id>
4.4 hilo标识符生成器
作用:由Hibernate按照一种high/low算法生成标识符,其从数据库中指定表的特定字段中获取high值。
原理: Hibernate在持久化对象时,由Hibernate负责生成主键值。
适用范围:
1). 数据库系统:支持所有的数据库,因其不依赖于底层数据库系统;
2). OID定义类型:必须为long、int或short类型,若定义为byte类型,在运行时会抛出异常。
<!-- hilo标识符生成器在生成标识符时,需要读取并修改HI_TABLE表中的NEXT_VALUE值 --><id name="id"> <generator class="hilo"> <param name="table">HI_TABLE</param> <param name="colume">NEXT_VALUE</param> <param name="max_lo">10</param> </generator></id>
4.5 native标识符生成器
原理:依据底层数据库对自动生成标识符的支持能力,选择使用identity、sequence或hilo标识符生成器。
适用范围:
1). 数据库系统:支持所有的数据库,适合于跨数据库平台开发;
2). OID定义类型:必须为long、int或short类型,若定义为byte类型,在运行时会抛出异常。
5. property元素
6. Hibernate内置映射类型
6.1 映射类型对应关系
6.2 Java时间日期类型的Hibernate映射
对应关系:在JDBC API中,java.util.Date类是java.sql.Date、java.sql.Time和java.sql.Timestamp类的父类,分别与标准SQL类型中的DATE(日期)、TIME(时间)和TIMESTAMP(时间戳,同时包含日期和时间)类型对应。
具体使用:设置持久化类的Date类型时,应设置为java.util.Date,且可通过property的type属性来将其映射为DATE、TIME或TIMESTAMP类型。
<!-- 强制将java.util.Date类映射为SQL类型中的TIMESTAMP类 --><property name="date" type="timestamp"> <column name="DATE" /></property>
7. Java大对象类型的Hiberante映射
<!-- 在对象关系映射文件中映射大对象 --><!-- <property name="content" type="clob"> <column name="CONTENT"></column></property><property name="image" type="blob"> <column name="IMAGE"></column></property>--><!-- 利用sql-type属性精确映射大对象类型与MySQL类型 --><property name="content"> <column name="CONTENT" sql-type="mediumtext"></column></property><property name="image"> <column name="IMAGE" sql-type="mediumblob"></column></property>
@Testpublic void testBlob() throws Exception { News news = new News(); news.setAuthor("qiaob"); news.setTitle("qiaobc"); news.setContent("I Love You!"); // 大文本 news.setDate(new Date()); // 保存大对象: private Blob image; 二进制图片 InputStream in = new FileInputStream("test.png"); Blob image = Hibernate.getLobCreator(session).createBlob(in, in.available()); news.setImage(image); session.save(news); // 输出大对象 news = (News) session.get(News.class, 14); Blob image2 = news.getImage(); InputStream inputStream = image2.getBinaryStream(); System.out.println(inputStream.available());}
8. 映射组成关系
<!-- 在Worker.hbm.xml文件中配置映射组成关系 --><component name="pay" class="Pay"> <!-- 若Pay类中有Worker属性时可配置 --> <parent name="worker"/> <!-- 配置组成关系的组件属性 --> <property name="monthlyPay" column="MONTHLY_PAY" type="integer"></property> <property name="yearPay" column="YEAR_PAY" type="integer"></property> <property name="vocationWithPay" column="VOCATION_WITH_PAY" type="integer"></property></component>
- Hibernate4-4 对象关系映射文件
- 对象关系映射文件
- hibernate4实战4—映射关系
- Hibernate4关系映射总结
- 对象关系映射文件详解
- Hibernate4一对多关系映射
- Hibernate4-8 映射继承关系
- Hibernate4使用注解关系映射
- Hibernate4教程四:关系映射
- hibernate4.x映射对象标识符
- hibernate 对象关系映射文件详解
- Hibernate HelloWorld-05 对象关系映射文件
- 1003--对象关系映射文件(*.hbm.xml)
- hibernate 映射文件配置-对象关系模版
- Day 19 对象关系映射文件
- Hibernate4实战 之 第四部分:关系映射
- Hibernate4实战 之 第四部分:关系映射
- Hibernate4实战 之 第四部分:关系映射
- Python机器学习算法速查
- 1.6:继承
- 用Spark学习矩阵分解推荐算法
- 常见C++面试题及基本知识点总结(一)
- STM32更换晶振后没及时修改定时器参数,导致运算出错
- Hibernate4-4 对象关系映射文件
- 自己动手系列——实现一个简单的LinkedLis
- 使用git命令行进行项目合并
- 【Java集合系列】---总体框架
- 第一行代码笔记 (fragment)碎片的使用
- leetcode412
- 算法训练 安慰奶牛
- Matlab | mex混编多个cpp文件
- Android 事件分发机制