把A中的Integer B_id改爲 B b,而後在A的映射文件中添加: 安全
<many-to-one name="b" class="B的類全名" column="foreign key所在的字段名稱" not-null="true"/> session
注意:not-null屬性比較傻X,意思爲「設置關聯的字段的值是否能夠爲空」且默認值是false,意思是能夠爲空,通常咱們都須要改爲true,讓他不能夠爲空! 性能
最後呢,由於A的成立須要依賴於B,因此在取值賦值的時候,要先初始化B,而後再把B賦給A的B b屬性,不然A的Bb屬性就會成null,不少錯誤都是這麼出現的!!! this
在B中,用Set接口聲明一個HashSet()類型的屬性,用來盛放那麼多的A,如: spa
private Set As = new HashSet();//注意,這裏的As能夠隨便寫,但爲了方便,通常都寫成多的一方的複數形式
public Set getAs() {
return As;
} hibernate
public void setAs(Set As) {
this.As = As;
} 接口
既然B的pojo裏多了一個屬性,理所固然要在B的關聯映射文件裏也添加一個對應的關聯元素: ci
<set name="As" table="A"> get
<key><column name="B_id"/></key> <!--這裏寫的是兩個表之間的外鍵字段--> io
<one-to-many class="A`s fullname"/> <!--對了,這裏要寫A的類全名-->
</set>
這時候,由於B的成立須要依賴於A了,因此在取值賦值的時候,要先初始化A,而後用:
B.getAs().add(A1);
B.getAs().add(A2);
B.getAs().add(A3);
...
先得到B中的HashSet()集合,而後把初始化好了的A一個個加入到這個集合裏,才能徹底初始化好B。
一言之,就是前面兩項一塊兒設置就好了。這時候數據加載起來就很靈活了,能夠先加載"一"的一方,也能夠先加載「多」的一方,具體就要看實際業務了。
在前面兩種關聯映射的應用中,若是「多」的一方個數很是多,在持久化的時候,session.save(b)後,還要save不少的a,最後hibernate才能自動關聯起b和多個a,有沒有方法讓hibernate自動save多的一方,而且自動產生關聯呢?
咱們能夠在「一」的hbm文件中的set元素中增長一個屬性,如:
<set name="As" table="a" cascade="all">
<key>
<column name="b_id" not-null="true"/>
</key>
</set>
而後在加載數據的時候,只需讓a和b互相關聯,而後只持久化只有一個的b就能夠了:
b.getAs().add(a);
a.setB(b);
session.save(b);
關於cascade屬性的值:
1 | all | 對全部操做進行級聯操做 |
2 | save-update | 執行保存和更新操做時進行級聯操做 |
3 | delete | 執行刪除時進行級聯操做 |
4 | none | 不進行級聯操做 |
問題:hibernate的級聯操做跟MySql中的級聯操做哪一個性能更高更好用?
警告:設置了cascade屬性以後,在持久化操做中,爲了保證數據安全,hibernate會多執行一條update語句,並且是由」一「去一個個聯繫」多「,影響效率和性能!
如何破?請收看下期:神器的inverse屬性。