首先對于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,如需轉載請自行聯系原作者