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就是参数,和当前持

0 0
原创粉丝点击