天天看點

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

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的值是要互相引用的,是以也必須保持一緻,否則的話就會出現中間表裡的列增多了。不是我們想要的結果。相對來說我們平日分析最麻煩的多對多的關系,現在倒是很好配置了。

(不支援圖檔。。本來想把映射這裡用圖檔的。)

如有錯誤,請您批評與更正!!!

上一篇: adf