hibernate學習筆記(一)屬性映射和關聯關係映射
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 |
FLOAT |
4 |
double |
double Double |
DOUBLE |
8 |
big_decimal |
java.math.BigDecinimal |
NUMERIC |
8位含2位小數部分 |
character |
char Character String |
CHAR(1) |
定長字符 |
string |
java.langString |
VARCHAR |
變長串 |
boolean |
boolean Boolean |
BIT |
布爾 |
yes_no |
boolean Boolean |
CHAR(1) |
布爾 |
true_false |
boolean Boolean |
CHAR(1) |
布爾 |
Java的時間類型:
Hibernate |
java |
sql |
取值範圍 |
date |
util.Date sql.Date |
DATE |
YYYY-MM-DD |
time |
util.Date sql.Time |
TIME |
HH:MM:SS |
timestamp |
util.Date sql.timestamp |
TIMESTAMP |
YYYYMMDDHHMMSS |
calendar |
java.util.Calendar |
TIMESTAMP |
YYYYMMDDHHMMSS |
calendar_date |
java.util.Calendar |
DATE |
YYYY-MM-DD |
大對象類型:
Hibernate |
java |
sql |
binary |
byte[] |
VARBINARY(BLOB) |
text |
String |
CLOB |
serializable |
實現類 |
BARBINARY(BLOB) |
clob |
sql.Clob |
CLOB |
blob |
sql.Blob |
BLOB |
JDK自帶的個別java類的映射類型
Hibernate |
java |
sql |
class |
java.lang.Class |
VARCHAR |
locale |
java.util.Locale |
VARCHAR |
timezone |
java.util.TimeZone |
VARCHAR |
currency |
java.util.Currency |
VARCHAR |
複雜對象的映射:(其實也沒多複雜,就是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>
</class>
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 long id;
private String name;
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>
</set>
配置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的值是要相互引用的,所以也必須保持一致,否則的話就會出現中間表裏的列增多了。不是我們想要的結果。相對來說我們平日分析最麻煩的多對多的關係,現在倒是很好配置了。
(不支持圖片。。本來想把映射這裏用圖片的。)
如有錯誤,請您批評與更正!!!
最後更新:2017-04-02 06:51:45