第03章 单表映射
1 映射关系总览
①单类→单表
②单向n对1
③双向1对n
④1对1基于外键
⑤1对1基于主键
⑥单向多对多
⑦双向多对多
2 对象关系映射文件
2.1 Hibernate使用*.hbm.xml文件定义持久化类和数据库表之间的映射关系,并以这个文件为依据生成各种SQL语句
2.2 映射关系
①持久化类:数据库表
②持久化类属性:数据库表中的字段
2.3 元素属性说明
<property>子元素用于设定持久化类与字段的映射关系。主要包括name,type,column,not-null等属性。 Name:持久化对象的属性名; Column:数据库的字段名; Type:通常用来指定hibernate映射数据类型,比如:integer,string,character,date,timestamp,float,object,blob等。它是java类属性的数据类型与数据库字段数据类型的桥梁,如果不进行类型设定,hibernate它会使用反射来得到这个名字的属性,以此来猜测正确的hibernate类型。 Not-null:属性中不能为空。 Length:属性的长度。
3 Hibernate中主键生成方式
3.1 increment
①由Hibernate以递增的方式为代理主键赋值
②Hibernate会先读取数据库表中的主键的最大值,插入记录时以最大值+1作为主键
③不依赖底层数据库系统,所以适合各种类型的数据库
④在多线程模式下运行时,很容易发生错误(多个线程可能获取数据库表中的主键的最大值相同,都以最大值+1作为主键向数据库表中插入记录,导致插入到数据库表中的多条记录的主键相同,从而违反了数据库表中主键的唯一性,故会报错)
⑤OID必须为long、int或short类型,如果为byte则会抛出异常
3.2 hilo
由Hibernate根据high/low算法生成主键
3.3 identity
①由具体数据库负责生成主键
②要求数据库将主键定义为自动增长类型
③支持自增主键的数据库:MySQL、DB2、微软SQLServer、Sybase等;
但是有局限性,因为Oracle不支持;
④OID必须为long、int或short类型,如果为byte则会抛出异常
3.4 sequence
①利用底层的数据库提供的序列生成标识符
②要求底层数据库支持序列:DB2、Oracle
3.5 native
①依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo
②由于native标识符生成器能够根据底层数据库系统的类型,自动选择合适的方式生成主键,所以非常适合跨数据库平台开发
③OID必须为long、int或short类型,如果为byte则会抛出异常
3.6 assigned(指定的)
Hibernate和数据库都不负责生成主键的值,完全由程序员自己指定。
3.7 其他主键生成方式
select、seqhilo、foreign、guid等等
4 J
5 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
定长字符
6 java中大对象类型的Hibernate映射
6.1 大对象
①长字符串:长度超过255的字符串
②二进制数据:图片、音频、视频等文件
6.2 使用Hibernate工具类创建大对象
FileInputStream in = new FileInputStream( "chain.jpg");
Blob photo = Hibernate.getLobCreator(session ).createBlob(in, in.available());
6.3 通过大对象获取输入流
InputStream in = blob.getBinaryStream();
附:MySQL中四种BLOB类型的最大范围
类型
大小
TinyBlob
255字节
Blob
65KB
MediumBlob
16MB
LongBlob
4GB