hibernate ORM映射——单表映射

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    BLOB
java.lang.String    text    TEXT    CLOB
实现java.io.Serializable接口的任意Java类    serializable    BLOB    BLOB
java.sql.Clob   clob    CLOB    CLOB
java.sql.Blob   blob    BLOB    BLOB
java.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值