天天看點

【Hibernate架構開發之七】Annotation各種關系CRUD增删改查&集合映射&繼承映射

 首先對于Annotation中CRUD的C(Create)操作:------------------------

假設 :   User (MonyToOne)       Group

OK,那麼有如下 Junit Code:

Configuration cfg = new AnnotationConfiguration(); 

SessionFactory sf = cfg.configure().buildSessionFactory(); 

Session ss = sf.getCurrentSession(); 

Group group = new Group(); 

group.setName("Group1"); 

User user = new User(); 

user.setName("User_Himi");//備注1(在記憶體中建議關系) 

user.setGroup(group); 

ss.beginTransaction(); 

//ss.save(group);//備注2 

ss.save(user); 

ss.getTransaction().commit(); 

sf.close(); 

備注1:如果想讓兩個在資料庫中建立關聯,那麼在記憶體中就需要讓其設定關聯。

備注2:如果這裡備注2行代碼注視掉,是會報錯的。因為Hibernate預設情況不會自動儲存關聯變量到資料庫中,不論是CRUD的任何操作,都預設不自動存儲(不會産生集聯)。

那麼如果需要設定自動操作關聯對象的話,可以使用cascade例如目前在@ManyToOne中設定:

<a href="http://blog.51cto.com/xiaominghimi/969785#">?</a>

1

2

3

<code>@ManyToOne</code><code>(cascade={</code>

<code>            </code><code>CascadeType.ALL</code>

<code>    </code><code>})</code>

這裡cascade中需要一個數組的參數,參數均為CascadeType,其中CascadeType的類型有如下幾種:

CascadeType.ALL,//所有操作 

CascadeType.MERGE,//合并 

CascadeType.PERSIST,//儲存 

CascadeType.REFRESH,//重新整理 

CascadeType.REMOVE  //删除 

總結:預設情況下有關聯的對象,不論任何形式的關系映射,不論單向還是雙向,在Session進行持久化時都互不影響也不自動建立集聯;如果需要自動建立集聯關系到資料庫中,那麼在關系映射的注解上設定cascade!

另外一點:雙向關系在程式中要設定雙向的記憶體關聯關系,并且雙向需要設定mappedBy!

要注意!使用CascadeType.ALL之外的類型,必須使用對應的函數方法才行!

    對于Annotation中CRUD的R(read)操作:------------------------

1. 在CUD操作時cascade才會有集聯影響,但是杜宇R讀取時使用fetch!

2.預設情況下在讀取ManyToOne 取出任何一個Many中的對象,那麼對應的One會預設取出來;

預設情況下 在讀取OneToMany時取出One的時,預設Many不會取出來;

如果需要手動設定可以使用fetch;

fetch有兩個值:

1). EAGER  (立刻的)

2). LAZY  (懶惰d的)

如果你想在OneToMany時取出One的時候立刻取出所有其他many的,可以設定如下:

@OneToMany(fetch=FetchType.EAGER)  這樣就會取出One的時候取出所有的Many對象

備注:當你OneToMany使用EAGER的時候,可以在sessionFactory關閉後仍然可以取Many中的任意一個元素,但是如果ManyToOne并使用LAZY的時候你在sessionFactory關閉後不可以取出One,因為是LAZY預設不會幫你取出One!

注意:1)兩方不要同僚設定Eager(會有多餘的查詢語句發出)

                     2) 對多方設fetch時要注意:一般用Lazy ;

對于Annotation中CRUD的U(update)操作:------------------------

簡單;update不多說;

對于Annotation中CRUD的D(delete)操作:------------------------

預設delete的時候,例如:ManyToOne,那麼删除many中的一個元素時,那麼Hibernate會首先删除對應的元素,然後繼續删除對應關聯的One,那麼發現表中(Many)還有其他的元素,會先删除所有其他的Many元素,最後删除One;

解決方案:

1)使用其他的cascade,不直接使用ALL類型;

2)打破關聯關系。利用緻null,将關聯的One可以set為null,再删除對應記錄即可;

3)使用HQL語句删除

.......................................集合映射.................................

一般使用如下集合:

Set(HashSet) 一般情況下使用;

List (ArrayList) 一般需要排序的時候使用;

排序可以使用注解:@OrderBy("name ASC")

Map (HashMap)    需要注視  @MapKey(name="id")

.......................................繼承映射.................................

繼承映射有三種形式:

1)使用一張表的形式  : SINGLE_TABLE

2) 沒各類分别一張表 TABLE_PER_CLASS

3) 每個子類一張表  JOINED

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/969785,如需轉載請自行聯系原作者