第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 |