2011-06-08 136 views
3

我想在現有項目上評估JPA。數據庫模型和java類存在並且通過自生代碼映射。數據庫模型和java類不能完美地結合在一起 - 但自定義映射效果很好。儘管如此,JPA的使用似乎值得一試。JPA使用連接表的JPA一對多單向關係

正如你所看到的,我是JPA的新手,必須使用xml配置完成工作。目前我正在使用連接表(請不要在此討論此szenario)處理一對多單向關係。

A (one - relationship owner) <-> AB (JoinTable) <-> B (many) 

的表格看起來像這樣

A 
-- 
ID 
BREF 
... 

B 
-- 
ID 
... 

AB 
-- 
A_BREF  (foreign key to a reference column in A which is NOT the id) 
B_ID 

我想定義爲A類

class A { 

private List<B> bs; 

} 

單向的一對多的關係,這樣做是這樣的:

<one-to-many name="bs"> 
    <join-table name="ab"> 
     <join-column name="a_bref"> 
      <referenced-column-name name="bref" /> 
     </join-column> 
     <inverse-join-column name="b_id"> 
      <referenced-column-name name="id" /> 
     </inverse-join-column> 
    </join-table> 
</one-to-many> 

Althoug th是不強制一個錯誤,它不工作。問題在於連接表不適用於A的ID列。對於選擇「B」實體的查詢使用A.ID列值而不是A.BREF列值來選擇實體。

(How)我可以使這個映射工作(我使用eclipselink 2.2.0)?

感謝您的任何建議!


編輯:

看着@ SJuan76答案提供的鏈接後,我稍微修改了我的映射

<one-to-many name="bs"> 
    <join-table name="ab"> 
     <join-column name="a_bref" referenced-column-name="bref" /> 
     <inverse-join-column name="b_id" referenced-column-name="id" /> 
    </join-table> 
</one-to-many> 

現在,這將導致以下錯誤(與EclipseLink的2.1測試。 0和2.2.0)

eclipselink 2.1.0

異常描述:參數名稱 [BREF]在查詢的選擇標準 不匹配在查詢中定義的任何參數 名稱。

的EclipseLink 2.2.0

異常描述:參考 列名[BREF]映射到 元素[字段BS]不 對應於有效的字段上 映射參考。

順便說一句 - 如果我從定義中刪除referenced-column-name="bref"我得到了referenced-column-name="id"逆連接列元素在同一個例外。所以我懷疑我已經明白referenced-column-name是正確的。我用它來指定與連接表相關的表的數據庫列名。它是否正確?


SOLUTION

我SZENARIO最後的錯誤是,我沒有足夠的BREF場在我班上

class A { 
    private long bref; // missing ! 
    private List<B> bs; 
} 

,在我這個類orm.xml映射文件definied

<basic name="bref"> 
    <column name="bref" /> 
</basic> 

我是n不知道我必須在我的映射類的某處定義使用的連接映射referenced-column-name屬性(因爲我也沒有將連接表本身或映射到類或類的連接列/反連接列的屬性name成員)。

此外,檢查案例問題的提示對我很有幫助。現在我覺得在指定我的映射時非常繁瑣,因爲我用小寫值覆蓋了所有的默認(大寫)映射。由於我的數據庫不區分大小寫,我將使用大寫符號,如果特殊映射需要使用默認值。

+1!

回答

1

您可以嘗試將字段定義爲「BREF」,或者如果您在屬性映射中定義了該字段,也可以嘗試將eclipselink.jpa.uppercase-column-names持久性屬性設置爲true。當被引用的column-name =「bref」被移除時,這可能是「id」的問題,因爲實體中的字段很可能默認爲「ID」。

+0

你給出了最後的提示(如果你在屬性mapping_上定義它),所以我會接受你的答案。爲我的問題添加了具體的解決方案。謝謝! – FrVaBe 2011-06-10 15:06:46

1
+0

您提供的鏈接與我的問題不匹配,因爲它解釋了沒有連接表的映射。儘管如此,該網站還提供了我檢查過的[join table](http://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Join_Table)示例。這導致了我目前正在研究的一些例外情況。 +1目前爲止的鏈接。 – FrVaBe 2011-06-08 13:00:05

1

一般JPA要求外鍵/連接列引用主鍵/實體的標識。但是,這應該適用於EclipseLink,因此請包括正在生成的SQL,如果它錯了,請記錄一個錯誤。

A的Id是如何定義的,它只是ID或ID和BREF?

您可以使用DescriptorCustomizer自定義關係的ManyToManyMapping並設置正確的外鍵字段名稱。

+0

A的ID只是ID。生成的SQL是有效的,但不像前面提到的那樣使用A.BREF。我做了一些修改,現在得到一個例外。請看看我的問題編輯部分。將現在去谷歌的DescriptorCustomizer .... – FrVaBe 2011-06-08 13:29:11

+0

您目前的例外可能是一個案件問題。默認的列名是大寫字母,所以請嘗試在列名中使用全部大寫字母。 – James 2011-06-09 13:26:08