hibernate的小小映射
hibernate的映射本人給分為兩種,一個是簡單屬性的映射,一個相對複雜屬性的映射,複雜屬性指的是set list map等。
簡單的映射:(隻列舉一些常見的屬性和常用的配置方法)
private string name;
private int gender;
private date birthday;
private byte[] photo;
private string desc; //description 的簡寫
對應的hibernate的映射配置:
<property name="name" column="" insert="true" not-null="true" update="true" length="" ></property>
紅色字型的可以選擇配置:屬性介紹:
column="" 代表生成的表中的name屬性對應的列名,如果不指定,則預設與name屬性相同
not-null="true" 不允許為空
length: 一般在設定字元串類型,或者binary,blob等類型時,設定其最大的長度。
<property name="gender" type="int" />
最簡單的基本設定
<property name="birthday" type="date" />
type 為生成表時,該字段的類型,而日期的類型有多種:年月日,時分秒,年月日時分秒,每個都有其對應的值
<property name="photo" type="binary" length="512000"/>
length屬性表示了上傳的圖檔最大為512000位元組
<property name="desc" column="`desc`"/>
column屬性設定的是列名,但是該列名與關鍵字沖突,是以為了避免這一問題,加了兩個反引号(左上角波浪形)
這裡介紹一下對應的映射類型:hibernate—java-db(需要注意的是,db每種都有細節上的不同,這裡僅是适用于大多數)
内置的映射類型:
hibernate
java
sql
取值範圍
int或integer
int 或java.lang.integer
integer
4
long
long或java.lang.long
bigint
8
short
short short
smallint
2
byte
byte byte
tinyint
1
float
float float
double
double double
big_decimal
java.math.bigdecinimal
numeric
8位含2位小數部分
character
char character string
char(1)
定長字元
string
java.langstring
varchar
變長串
boolean
boolean boolean
bit
布爾
yes_no
true_false
java的時間類型:
date
util.date sql.date
yyyy-mm-dd
time
util.date sql.time
hh:mm:ss
timestamp
util.date sql.timestamp
yyyymmddhhmmss
calendar
java.util.calendar
calendar_date
大對象類型:
binary
byte[]
varbinary(blob)
text
clob
serializable
實作類
barbinary(blob)
sql.clob
blob
sql.blob
jdk自帶的個别java類的映射類型
class
java.lang.class
locale
java.util.locale
timezone
java.util.timezone
currency
java.util.currency
複雜對象的映射:(其實也沒多複雜,就是set,list,map,object[]這些東西的映射)
這個會在用到的時候寫
仔細想了想,還是和對象關系映射一起寫吧,這樣實用性也比較強
接上面的user繼續談:
一對多映射:
現在有一個實體department部門:和user的關系是一對多(一個部門有多個員工),這裡主要用的是set的映射。
private long id;
private string name;
private string desc;
private set<user> set;
這個時候在user實體中也要加一個屬性就是:private department department;
對應的配置檔案:
<class name="department" table="test_department" >
<set name="set" >
<key column="departmentid" ></key>--------在department
<one-to-many class="user" />
</set>
</class>
<class name="user" table="test_user" >
<many-to-one name="department" class="department" column="departmentid"></many-to-one>
user表中一個外鍵列departmentid,
下面仔細描述一下這些屬性之間的關系:
如果我們自己寫這個一對多的對應關系的映射,那麼我個人建議先從多的一方寫起,在這裡就是user,我們的建表規則一般就是預設的在多的一方建外鍵,這個時候,在user裡面維護一個屬性department,其與department的對應關系是多對一,是以寫<many-to-one> name屬性就是我們維護的屬性的名字,class就是其對應的類,最後一個column是最關鍵的,它标志着,在我們即将自動生成的user表中的外鍵列—這裡是departmentid,而在department表中對應的實體映射(這裡應該參照javabean)應該為set,
并且是一的一方,是以為<one-to-many>,但是<set>必須要添加一個<key>屬性,key中有一個column屬性,這個<key>可以什麼都不指定,就<key />就可以,這樣預設的就會引用剛才我們配置的外鍵列departmentid,如果指定并且和user的外鍵列一緻,那麼就會在user表中隻有一個外鍵列departmentid(建議這麼配置),如果<key column=?>這個屬性配置的和user引用的外鍵列不一緻,那麼就會在user表中生成兩個外鍵列。造成備援。
多對多映射:使用者-----崗位
我們再添加一個實體崗位:station
private set<user> user;
并且這時我們要在user實體中添加一個新的屬性:
private set<station> station;
首先我們已經分析出了使用者與崗位是多對多的關系,那麼我們最明白的就是這個時候為了表述清楚他們之間的關系,我們必須建立一個中間表。這個時候配置如下:
先配置user:
<set name="station" table="user_station">
<key column="userid"></key>
<many-to-many class="station" column="stationid" ></many-to-many>
配置station:
<set name="user" table="user_station">
<key column="stationid"></key>
<many-to-many class="user" column="userid"></many-to-many>
</set>
還是依次介紹這些屬性,name就不用說了吧就是寫實體bean時候的那個屬性名。table是中間表的表名,這兩個多對多關系的配置的該屬性必須一緻。<key column=?>這個屬性名和在對應關系的<many-to-many 中column屬性必須一緻。這個就不像一對多那種随意的控制,因為這個column的值是要互相引用的,是以也必須保持一緻,否則的話就會出現中間表裡的列增多了。不是我們想要的結果。相對來說我們平日分析最麻煩的多對多的關系,現在倒是很好配置了。
(不支援圖檔。。本來想把映射這裡用圖檔的。)
如有錯誤,請您批評與更正!!!