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的數據會比外鍵關聯少一個外鍵字段。(這裏我暫時沒有考慮到外鍵對於查詢效率的影響),還有就是表間關聯能有效減少數據的冗餘問題。