Hibernate4註解詳解之一對多對象映射

2.一對多(對於一對多的關係來說,建議使用雙向的外鍵關聯)

         1.1單向-》外鍵關聯(由SubTest獲取Test)

         Test.class(idauto_increment)

         SubTest.class

         @Id

         @GeneratedValue(strategy=GenerationType.AUTO)

         @Column(name="id")

         privateint id;

         @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)

         @JoinColumn(name="ddd")//默認不填JoinColumn會自動生成一個外鍵字段

         privateTest test;

         一對多的單向只需在多的類SubTest中設置ManytoOne註解,級聯方式的區別在於更新,刪除,插入的時候是否對Test也同樣進行操作。

         單向關聯時,在查詢時,EARGER方式也是以SubTest左外連接Test。在save數據時,需要關心其級聯方式。

         1.2單向-》外鍵關聯(由Test獲取SubTest)

         兩個id都爲auto_increment

         Test.class

         @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)

         @JoinColumn(name="ddd")

         publicList<SubTest> subtests;

         由Test獲取到SubTest的外鍵關聯只要配置OneToMany和JoinColumn,這樣會在SubTest表中多一個外鍵字段。

         1.3單向-》表間關聯

         Test.class(idauto_increment)

         SubTest.class

         @Id

         @GeneratedValue(strategy=GenerationType.AUTO)

         @Column(name="id")

         privateint id;

         @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)

         @JoinTable(name="dog",joinColumns = {@JoinColumn(name="bcd")},  

         inverseJoinColumns= { @JoinColumn(name = "abc")} )

         privateTest test;

表間關聯單向在save只需save一個Subtest對象,SubTest對象中需要set一個Test對象。

在查詢時,EAGER的方式也是以外連接的方式。多處一個表來維護兩個表之間的關係,也是不建議使用。

         2.1雙向-》外鍵關聯

         Test.class

         idauto_increment

         @OneToMany(cascade=CascadeType.ALL)(方便save保存數據)

         @JoinColumn(name="ddd")

         publicList<SubTest> subtests;

         SubTest.class

         idauto_increment

         @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)

         @JoinColumn(name="ddd")//默認不填JoinColumn會自動生成一個外鍵字段

         privateTest test;

雙向的外鍵關聯,只需在Test設置OneToMany,JoinColumn,注意JoinColumn的name需要與SubTest中的JoinColumn的name名字相同。

在save數據的時候,根據級聯關係來對save進行操作。在查詢數據時,從Test獲取到SubTest繼續獲取Test依舊只會查詢Test左外連接SubTest,不用擔心多連接關係。

         單向和雙向的區別只在於查詢的時候,能否從一個對象中獲取到其包含的對象,在數據庫的表現上是一樣的。雙向外鍵關聯在通過一個對象獲取到另一個或者多個對象是,區別在於是誰左外連接誰,一般情況是主要對象左外連接次要對象的表。(次要對象爲需要獲取的對象)。所以其實,在一對多的關係中沒必要去區分單向和雙向,都同意規定爲雙向,即使沒有這樣的需求。

         2.2雙向-》表間關聯

         Test和SubTest的id都爲auto_increment

         Test.class

         @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)

         @JoinTable(name="dog",joinColumns = @JoinColumn(name="abc"),  

                            inverseJoinColumns= @JoinColumn(name = "bcd"))

         publicList<SubTest> subtests;

         SubTest.class

         @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)

         @JoinTable(name="dog",joinColumns = {@JoinColumn(name="bcd")},  

         inverseJoinColumns= { @JoinColumn(name = "abc")} )

         privateTest test;

         雙向的表間關聯二者都使用JoinTable標籤註解,joinColumns爲dog表對應自身的字段,inverseJoinColumns爲相對應表在dog表的字段,均爲外鍵。SubTest和Test的設置應該相反。字段。

         上面介紹了單向和雙向的區別。這裏再講講表間關聯和外鍵關聯的區別。單對於一對多的關係來說,維護一對多的關係,在外鍵關聯看來,只需在多的一方(即SubTest)中設置一個外鍵,而表間關聯需要多維護一張關係表。這裏的效率不言而喻,使用外鍵關聯的效率反而會比較好。如果要說外鍵關聯在什麼時候會比表間關聯效率差,可能只有當你只需要查詢SubTest的時候,而不需要獲取到Test的對象,這時表間關聯的SubTest的數據會比外鍵關聯少一個外鍵字段。(這裏我暫時沒有考慮到外鍵對於查詢效率的影響),還有就是表間關聯能有效減少數據的冗餘問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章