Hibernate映射類型分為兩種:內(nèi)置的映射類型和客戶化映射類型。內(nèi)置映射類型負(fù)責(zé)把一些常見的Java類型映射到相應(yīng)的SQL類型;此外,Hibernate還允許用戶實(shí)現(xiàn)UserType或CompositeUserType接口,來靈活地定制客戶化映射類型
1.內(nèi)置映射類型
1).Java基本類型的Hibernate映射類型
2). Java時(shí)間和日期類型的Hibernate映射類型
* 當(dāng)程序類型為java.sql.Timestamp, 數(shù)據(jù)庫(kù)中表屬性類型為timestamp的情況下,即使用戶以空值插入數(shù)據(jù),數(shù)據(jù)庫(kù)系統(tǒng)仍然會(huì)自動(dòng)填充timestamp的值
3). Java 大對(duì)象類型的Hibernate映射類型
* 在應(yīng)用程序中通過Hibernate來保存java.sql.Clob或者java.sql.Blob實(shí)例時(shí),必須包含兩個(gè)步驟:
a. 在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中先保存一個(gè)空的Blob或Clob實(shí)例;b. 接著鎖定這條記錄,更新在步驟(1)中保存的Blob或Clob實(shí)例,把二進(jìn)制數(shù)據(jù)或長(zhǎng)文本數(shù)據(jù)寫到Blob或Clob實(shí)例中。
* 一個(gè)java類型對(duì)應(yīng)多個(gè)Hibernate映射類型的場(chǎng)合。例如,如果持久化類的屬性為java.util.Date類型,對(duì)應(yīng)的Hibernate映射類型可以是date,time
或timestamp。此時(shí)必須根據(jù)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的字段的SQL類型,來確定Hibernate映射類型。如果字段為Date類型,則hibernate映射為datge,如果為TIME則為time,如果為TIMESTAMP則為timestamp。
2.客戶化映射類型
(很麻煩的一個(gè)東西,稍微看了看,日后需要再研究并總結(jié))
1.內(nèi)置映射類型
1).Java基本類型的Hibernate映射類型
Java類型 | Hibernate映射類型 | 標(biāo)準(zhǔn)SQL類型 | 大小和取值范圍 |
int/Integer | int/integer | INTEGER | 4Byte |
long/Long | long | BIGINT | 8Byte |
short/Short | short | SAMLLINT | 2Byte |
byte/Byte | byte | TINYINT | 1Byte |
float/Float | float | FLOAT | 4Byte |
double/Double | double | DOUBLE | 8Byte |
BigDecimal | big_decimal | NUMBERIC | Numeric(8,2) |
char/Character/String | character | CHAR(1) | 定長(zhǎng)字符 |
String | string | VARCHAR | 變長(zhǎng)字符 |
boolean/Boolean | boolean | BIT | 布爾類型 |
boolean/Boolean | yes/no | CHAR(1)('Y'/'N') | 布爾類型 |
boolean/Boolean | true/false | CHAR(1)('T'/'F') | 布爾類型 |
2). Java時(shí)間和日期類型的Hibernate映射類型
Java類型 | Hibernate映射類型 | 標(biāo)準(zhǔn)SQL類型 | 描述 |
java.util.Date/java.sql.Date | date | DATE | 日期,yyyy-mm-dd |
java.util.Date/java.sql.TIme | time | TIME | 時(shí)間,hh:mm:ss |
java.util.Date/java.sql.Timestamp | timestamp | TIMESTAMP | 時(shí)間戳,yyyymmddhhmmss |
java.util.Calendar | calendar | TIMESTAMP | 同上 |
java.util.Calendar | calendar_date | DATE | 日期,yyyy-mm-dd |
* 當(dāng)程序類型為java.sql.Timestamp, 數(shù)據(jù)庫(kù)中表屬性類型為timestamp的情況下,即使用戶以空值插入數(shù)據(jù),數(shù)據(jù)庫(kù)系統(tǒng)仍然會(huì)自動(dòng)填充timestamp的值
3). Java 大對(duì)象類型的Hibernate映射類型
Java類型 | Hibernate映射類型 | 標(biāo)準(zhǔn)SQL類型 | MySql類型 | Oracle類型 |
byte[] | binary | VARBINARY/BLOB | BLOB | BLOB |
String | text | CLOB | TEXT | CLOB |
serializable | 實(shí)現(xiàn)serializable接口的一個(gè)java類 | VARBINARY/BLOB | BLOB | BLOB |
java.sql.Clob | clob | CLOB | TEXT | CLOB |
java.sql.Blob | blob | BLOB | BLOB | BLOB |
a. 在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中先保存一個(gè)空的Blob或Clob實(shí)例;b. 接著鎖定這條記錄,更新在步驟(1)中保存的Blob或Clob實(shí)例,把二進(jìn)制數(shù)據(jù)或長(zhǎng)文本數(shù)據(jù)寫到Blob或Clob實(shí)例中。
1

2
Session session = sessionFactory.openSession();
3
Transaction tx = session.beginTransaction();
4
Customer customer = new Customer();
5
customer.setDescription(Hibernate.createClob("")); //先保存一個(gè)空的clob
6
session.save(customer);
7
session.flush();
8
//鎖定這條記錄
9
session.refresh(customer,LockMode.UPGRADE);
10
oracle.sql.CLOB clob = (oracle.sql.CLOB) customer.getDescription();
11
java.io.Writer pw = clob.getCharacterOutStream();
12
pw.write(longText);//longText是一個(gè)長(zhǎng)度超過255的字符串
13
pw.close();
14
tx.commit();
15
session.close();


2

3

4

5

6

7

8

9

10

11

12

13

14

15

* 一個(gè)java類型對(duì)應(yīng)多個(gè)Hibernate映射類型的場(chǎng)合。例如,如果持久化類的屬性為java.util.Date類型,對(duì)應(yīng)的Hibernate映射類型可以是date,time
或timestamp。此時(shí)必須根據(jù)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的字段的SQL類型,來確定Hibernate映射類型。如果字段為Date類型,則hibernate映射為datge,如果為TIME則為time,如果為TIMESTAMP則為timestamp。
2.客戶化映射類型
(很麻煩的一個(gè)東西,稍微看了看,日后需要再研究并總結(jié))