hibernate ORM映射——单表映射
来源:互联网 发布:淘宝网店怎样优化 编辑:程序博客网 时间:2024/05/20 05:25
1 映射关系总览
①单类→单表
②单向n对1
③双向1对n
④1对1基于外键
⑤1对1基于主键
⑥单向多对多
⑦双向多对多
2 单类→单表的映射
①映射主键
②映射日期类型
③映射大对象
④hbm文件中的其他属性
⑤数据类型映射对照表
3 Hibernate中主键生成方式
3.1 increment
①由Hibernate以递增的方式为代理主键赋值
②Hibernate会先读取数据库表中的主键的最大值,插入记录时以最大值+1作为主键
③不依赖底层数据库系统,所以适合各种类型的数据库
④在多线程模式下运行时,很容易发生错误
⑤OID必须为long、int或short类型,如果为byte则会抛出异常
3.2 hilo
①由Hibernate根据high/low算法生成主键
②hilo标识符生成器在生成标识符时,需要读取并修改HI_TABLE表中的NEXT_VALUE值
③完全不依赖于任何数据库系统
④OID必须为long、int或short类型,如果为byte则会抛出异常
HL_table
NEXT_VALUE
10
⑤高低算法
参见:《[尚硅谷]封捷参考资料:高低算法.doc》
3.3 identity
①由具体数据库负责生成主键
②要求数据库将主键定义为自动增长类型
③支持自增主键的数据库:MySQL、DB2、微软SQLServer、Sybase等
④OID必须为long、int或short类型,如果为byte则会抛出异常
3.4 sequence
①利用底层的数据库提供的序列生成标识符
②要求底层数据库支持序列:DB2、Oracle
③OID必须为long、int或short类型,如果为byte则会抛出异常
④配置方式
<id name ="studentId" type="java.lang.Integer"> <column name ="STUDENTID" /> <generator class ="sequence"> <param name ="sequence">stu_seq</ param> </generator ></id >
3.5 native
①依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo
②由于native标识符生成器能够根据底层数据库系统的类型,自动选择合适的方式生成主键,所以非常适合跨数据库平台开发
③OID必须为long、int或short类型,如果为byte则会抛出异常
3.6 assigned
Hibernate和数据库都不负责生成主键的值,完全由程序员自己指定。
3.7 其他主键生成方式
select、seqhilo、foreign、guid等等
4 在Hibernate中映射日期和时间
4.1 Java数据类型和JDBC API的对应关系
注:时间戳:从1970年1月1日0点0时0分0秒开始计时,到当前时间所经过的毫秒数
4.2 Hibernate中的日期映射方式
大部分情况下Hibernate可以根据Java类型自动找到对应的Hibernate映射类型,从而确定数据库表中的字段类型,但如果一个Java类型对应的Hibernate映射类型不只一个,那么就必须为Java类型明确指定Hibernate映射类型,例如
5 Java中大对象类型的Hibernate映射
5.1 大对象
①长字符串:长度超过255的字符串
②二进制数据:图片、音频、视频等文件
5.2 Java中的大对象类型
①长字符串
[1]java.lang.String[推荐]
[2]java.sql.Clob——Character Large Object,对应SQL标准类型中的CLOB
②二进制数据
[1]java.sql.Blob——Binary Large Object,对应SQL标准类型中的BLOB
[2]byte[]
5.3 MySQL不支持标准SQL的CLOB类型
①TEXT
②MEDIUMTEXT
③LONGTEXT
5.4 精确映射SQL类型
①使用Hibernate映射大对象
<property name= "content" type ="text"/>在MySQL中生成的字段类型:longtext
<property name= "photo" type ="blob"/>在MySQL中生成的字段类型:longblob
②精确指定SQL类型
<property name= "content" type ="text"> <column name ="my_content" sql-type="mediumtext" /></property><property name= "photo" type ="blob"> <column name ="my_photo" sql-type="mediumblob" /></property>
5.5 使用Hibernate工具类创建大对象
FileInputStream in = new FileInputStream( "chain.jpg");Blob photo = Hibernate.getLobCreator(session ).createBlob(in, in.available());
5.6 通过大对象获取输入流
InputStream in = photo.getBinaryStream();OutputStream out = new FileOutputStream( "aa.jpg");byte [] b = new byte[1024];int len = 0;while((len = in.read(b)) != -1){ out.write(b, 0, len);}in.close();out.close();
6 Hibernate映射类型对照表
Java类型 Hibernate映射类型 标准SQL类型 大小java.lang.Integer/int integer/int INTEGER 4字节java.lang.Long/long long BIGINT 8字节java.lang.Short/short short SMALLINT 2字节java.lang.Byte/byte byte TINYINT 1字节java.lang.Float/float float FLOAT 4字节java.lang.Double/double double DOUBLE 8字节java.math.BigDecimal big_decimal NUMERIC java.lang.Character/java.lang.String/char character CHAR(1) 定长字符java.lang.String string VARCHAR 变长字符java.lang.Boolean/boolean boolean/yes_no/true_false BIT 布尔类型java.util.Date/java.sql.Date date DATE 日期java.util.Date/java.sql.Timestamp timestamp TIMESTAMP 日期java.util.Calendar calendar TIMESTAMP 日期java.util.Calendar calendar_date DATE 日期byte[] binary BLOB BLOBjava.lang.String text TEXT CLOB实现java.io.Serializable接口的任意Java类 serializable BLOB BLOBjava.sql.Clob clob CLOB CLOBjava.sql.Blob blob BLOB BLOBjava.lang.Class class VARCHAR 定长字符java.util.Locale locale VARCHAR 定长字符java.util.TimeZone timezone VARCHAR 定长字符java.util.Currency currency VARCHAR 定长字符
7 对象关系映射文件
7.1 Hibernate使用*.hbm.xml文件定义持久化类和数据库表之间的映射关系,并以这个文件为依据生成各种SQL语句
7.2 映射关系
①持久化类:数据库表
②持久化类属性:数据库表中的字段
7.3 常用设置
作用 元素 属性 值
提取包名 hibernate-mapping package 包名
动态插入 class dynamic-insert true
动态更新 class dynamic-update true
更新游离对象前先查询 class select-before-update true
7.4 元素属性说明
参见《[尚硅谷]封捷参考资料:hbm文件元素属性说明.xlsx》
8 派生属性
①概念:并不是持久化类的所有属性都直接和表的字段匹配。持久化类的有些属性的值必须在运行时通过计算才能得出来,这种属性称为派生属性。
②formula属性
[1]formula=“(sql)”的英文括号不能少
[2]SQL表达式中的列名和表名都应该和数据库对应,而不是和持久化对象的属性对应
[3]如果需要在formula属性中使用参数,可直接使用where cur.id=id 形式,其中id就是参数,和当前持
- hibernate ORM映射——单表映射
- hibernate单表映射
- Hibernate单表映射
- hibernate单表映射
- Hibernate单表映射
- hibernate的ORM映射
- Hibernate 之单表映射
- hibernate单表继承映射
- hibernate单表继承映射
- Hibernate 03 : 单表映射
- Hibernate ORM 对象-关系 映射
- Hibernate ORM 对象-关系 映射
- Hibernate ORM 对象-关系 映射
- Hibernate 中的 ORM 映射 原理
- ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射
- ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射
- Hibernate 的两种继承映射关系,单表映射
- hibernate单表之组件映射和继承映射
- 角色武器类
- Android 文件操作
- Mybatis学习
- 史上最全:ant多渠道打包安卓工程(二)
- MySql中having字句对组记录进行筛选使用说明
- hibernate ORM映射——单表映射
- 通过GOT覆写实现ret2libc - 64-bit Linux stack smashing tutorial: Part 3
- 用8进制和16进制创建字符串
- java/android中对回调函数深入灵魂的理解
- hdu 1037 Keep on Truckin'
- 剑指offer系列之16:树的子结构
- Problem D: 数组----逆向存储
- scikit-learn学习1.10. 决策树(Decision Trees)
- HDU 1878 欧拉回路(并查集&&欧拉回路)