總結Hibernate中的幾種關聯映射的配置

1 單向多對一(多個A映射到一個B)

把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

2 單向一對多(一個B映射到多個A)

在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。

3 雙向一對多關聯(多個A一個B)

一言之,就是前面兩項一塊兒設置就好了。這時候數據加載起來就很靈活了,能夠先加載"一"的一方,也能夠先加載「多」的一方,具體就要看實際業務了。

3.1 cascade和inverse屬性

在前面兩種關聯映射的應用中,若是「多」的一方個數很是多,在持久化的時候,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 不進行級聯操做

注意:沒有設置cascade屬性時,hibernate不會進行級聯操做!

問題:hibernate的級聯操做跟MySql中的級聯操做哪一個性能更高更好用?

警告:設置了cascade屬性以後,在持久化操做中,爲了保證數據安全,hibernate會多執行一條update語句,並且是由」一「去一個個聯繫」多「,影響效率和性能!

如何破?請收看下期:神器的inverse屬性。

相關文章
相關標籤/搜索