2016-04-26 99 views
0

我想知道兩個表之間是否可以有一對多的jpa 2.x關係。我期待這樣的事情: (我搜索了很多與谷歌,找出沒有成功類似的情景)JPA 2.x單向一對多關係

CUSTOMER 
ID NAME RELATEDCOLORS 
1 John 10 
2 Albert 20 
3 Maria 10 
4 Smith null 

COLORS 
ID FATHERID COLOR 
1 10   Red 
2 10   Green 
3 10   Blu 
4 20   Cyan 

正如你可以看到每個人都有相應的顏色。所以,約翰和瑪麗亞的顏色都是紅色,綠色和藍色。對於艾伯特來說,顏色是青色,而史密斯則沒有顏色。

我已經試過這樣的事情:

客戶實體

.... 
@Id 
@Column(name = "ID", nullable = false) 
private long iId; 
@Column(name = "NAME") 
private String iName; 
@Column(name = "RELATEDCOLORS", nullable = true) 
private Long iRelatedColors; 
@JoinColumn(name = "FATHERID",referencedColumnName="RELATEDCOLORS", nullable=true) 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private List<Colors> iColors; 
.... 

請注意,我用了「龍iRelatedColors」,而不是「長iRelatedColors」因爲iRelatedColors屬性可以爲空

顏色實體

.... 
@Id 
@Column(name = "ID", nullable = false) 
private long iId; 
@Column(name = "FATHERID", nullable = false) 
private long iFatherId; 
@Column(name = "COLOR") 
private String iColor; 
.... 

我不會l IKE有型客戶的屬性在顏色實體

我需要的是:

  • 當讀取一個客戶,那麼列表的iColor必須當調用相應get填充...方法

  • 當我在更改iColors列表(例如:添加新顏色或刪除顏色)後更新客戶 時,顏色實體也必須更新。

而且我所有我需要的只有:

  • Customer表

    的RELATEDCOLORS列使用一個唯一的編號填寫(例如:10,20,30,40 ECC)

  • 在Customer表中,RELATEDCOLORS列必須始終不爲空,如果Colors表中存在相應的ID,則該列不會爲空。 如果其中一個CUSTOMER行在RELATEDCOLORS列中有一個空值,那麼在運行期間會有一個由Hibernate拋出的NullPointerException異常。

使用我顯示給你的數據不起作用,我不明白爲什麼。

在此先感謝您的幫助。

+0

你一對多的映射將明顯增加FK到顏色,所以如果你不這樣做像它然後刪除該映射,並把OneToOne/ManyToOne和FK將在客戶。 –

+0

客戶>顏色的關係顯然是@ManyToOne,所以我不確定你爲什麼要將它映射爲@OneToMany? –

+0

大家好,謝謝你的回答。尼爾,請問你能更具體些嗎? Alan,從表格數據中可以看出,客戶>顏色之間的關係是OneToMany。例如Jhon的顏色爲紅色,綠色和藍色 謝謝 – gpezzini

回答

0

您的模型包含太多不一致性,實際上並不常見。你做什麼,如果John獲得顏色Green, Blue and Cyan?這意味着,該字段RELATEDCOLORS無法除非表COLORS獲得更多的數據是這樣來評價,因爲還有Maria與顏色Red, Green and Blue

COLORS 
ID FATHERID COLOR 
1 10   Red 
2 10   Green 
3 10   Blue 
4 20   Cyan 
5 30   Green 
6 30   Blue 
7 30   Cyan 

這導致了大量的冗餘數據。您的Color -table實際上幾乎看起來像連接表,但不是。 此外,你的OneToMany-Relation是一個額外的連接表。

只是你的顏色映射爲單向一對多如下,顏色擺脫在客戶RELEATEDCOLORSFATHERID

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@JoinTable(name="CUSTOMER_COLORS", joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName="iId")}, inverseJoinColumns={@JoinColumn(name="COLOR_ID", referencedColumnName="iId")}) 
private List<Color> iColors;