閱讀234 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go java對象怎麼轉json數組
  下一篇:go 7.5 TableLayout布局詳解