2014-03-26 57 views
3

背景語境JPA - 與其他信息多到多個表包含在其中工作

之前進入的問題,我想首先我想指出,我只需要使用JPA讀取我的模式 - 有史以來,數據庫中的數據都不會受到影響/更改。

多對多加入發行

我有許多一對多在我的架構稱爲ParamInParamClass其中有包含的額外的非關鍵數據連接表。不過,在JPA中,我們通常會使用連接表多對多語法將ParamClass表加入Param,以獲取ParamClassParam對象的列表。

entity relationship diagram

所以,如果我用這個聯接語法:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(
     name="ParamInParamClass", 
     joinColumns = { 
      @JoinColumn(name = "FKParamClassID", referencedColumnName = "ID")}, 
     inverseJoinColumns = { 
      @JoinColumn(name="FKParamID", referencedColumnName="ID")}) 
private List<Parameter> params; 
ParamClass

,我就不能在ParamInParamClass訪問DefaultOverride | MinimumOverride | MaximumOverride

我該如何解決這種情況?

+0

檢查http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/ – hovanessyan

+0

謝謝,這看起來很有用。在休眠的基礎上使用JPA可以實現同樣的事情嗎? (我現在正在研究它,只是同時詢問)。 –

+0

請參閱EclipseLink完成的本手冊,其中建議使用JPA方法來解決此問題:http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns – perissf

回答

2

我基於@ perissf的鏈接解決了這個問題,並從@ hovanessyan的hibernate鏈接中學習了一些有用的信息。

我在下面提供了答案,因爲雖然它使用鏈接中的信息,但直接從鏈接獲得的代碼在JPA/Hibernate中無法使用 - 我必須使用註釋部分中提到的額外代碼的鏈接代碼。所以,閱讀鏈接頂部的內容有時候會和其他人一樣。


的解決方案是改變ParameterClass代碼,我到這個設置:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parameterClass") 
private List<ParamInParamClass> parameters; 
public List<ParamInParamClass> getParameters() { return parameters; } 

我只好再創建其中未之前需要如通常是許多一對多關係ParamInParamClass實體不需要你定義連接表。它需要在這裏定義,因爲我從中獲得額外的字段。

ParamInParamClass類,我必須顯式鏈接實體:

@Id 
@Column 
private String fkParamClassID; 
public String getFKParamClassID(){ return fkParamClassID; } 
public void setFKParamClassID (String value) { fkParamClassID = value; } 

@Id 
@Column 
private String fkParamID; 
public String getFKParamID(){ return fkParamID; } 
public void setFKParamID (String value) { fkParamID = value; } 

//--------------------------------------------------------------------------------------------- 
// Join columns based on key columns. 
//--------------------------------------------------------------------------------------------- 

@ManyToOne 
@JoinColumn(name = "fkParamClassID", referencedColumnName = "ID", insertable = false, updatable = false) 
private ParameterClass parameterClass; 

@ManyToOne 
@JoinColumn(name = "fkParamID", referencedColumnName = "ID", insertable = false, updatable = false) 
private Parameter parameter; 

,我也必須確保這ParamInParamClass類使用@IdClass,因爲它有一個以上的@Id屬性。

相關問題