2012-02-14 81 views
1

我正在爲我的實習開發JPA Compliancy工具包......該工具包的一部分涉及測試正確實施角落案例。@ ManyToMany/@ OneToMany mappedby屬性用於雙向關聯

@ManyToMany具有mappedBy屬性。 JPA聲明:

String mappedBy - 擁有該關係的字段或屬性。除非關係是單向的,否則是必需的。

沒有給出默認值 - 默認列爲空。

給定雙向@ManyToMany - 本示例來自JPA 2.0 JSR-317規範本身!

客戶

@ManyToMany 
@JoinTable(name="CUST_PHONES") 
public Set<PhoneNumber> getPhones() { return phones; } 

******中國

@ManyToMany(mappedBy="phones") 
public Set<Customer> getCustomers() { return customers; } 

的屬性的mappedBy尚未在Customer@ManyToMany定義!有沒有我不知道的雙向映射的默認值,或者是什麼?

我看着類似的情況,結果發現: @OneToOne - 的mappedBy是可選的,沒有默認 @OneToMany - 完全一樣@ManyToMany(的mappedBy是可選的雙向,沒有默認值)

總之,我的問題: 對於@ManyToMany@OneToMany,應該在關係的擁有方(例如Customer)的mappedBy屬性中放置什麼?

回答

1

這遠不是一個特例。每個雙向關聯都有一個所有者和一個反面。

JPA使用擁有方來決定兩個實體之間是否存在關聯。另一面被忽略。

擁有方是定義如何映射關聯的方法(使用JoinColumn,JoinTable等註釋)。它沒有任何mappedBy屬性。

反面使用mappedBy屬性來說:「嘿,我只是由以下屬性映射的屬性的反向關聯」。

因此,根據定義,擁有方沒有mappedBy屬性。如果它有一個,它不會是擁有方。

這在JPA spec中有很好的解釋。如果您需要爲此規範構建一個兼容套件,最好閱讀並理解它。

我實在不明白寫這樣的合規性套件的點,因爲正如寫在JPA2 JSR home page

由於所需的Java規範參與協議(JSPA), Java持久性API的,版本2.0 TCK將被授權在沒有 收費沒有支持合格的非營利實體。這種 資格將通過兼容性測試 獎學金計劃進行驗證。支持也可免費提供,獎學金委員會批准 。欲瞭解更多信息,請參閱 至:http://java.sun.com/scholarship/

+0

該兼容工具包只是JPA使用的註釋的單元測試的花哨名稱。現在關注ORM ......你是說這些單元測試(或者其他的東西)已經存在了嗎?我正在實習的公司希望我將其作爲測試其開源應用程序的一部分來開發。 我有點了解'mappedBy'的用法,我只是對其確切的措辭感到困惑。爲什麼說mappedBy註釋對於非單向關係是必需的而不排除雙向關係的擁有方? – Pimgd 2012-02-14 18:19:33

+0

TCK用於測試JPA實現。它不用於測試使用JPA構建的應用程序。所以我想你的套件可能會有用。它可能會這樣說,因爲開發人員很懶,並且認爲註釋的用戶會讀取JPA規範或註釋本身的javadoc,其中詳細解釋了mappedBy屬性的使用。 – 2012-02-14 18:27:29

+0

「,其中詳細解釋了mappedBy屬性的使用。」你能給我一個這個文檔的鏈接嗎?我可以在網上找到它的一些,但它似乎鸚鵡在JSR-317規範中可以閱讀的內容......並沒有揭示這種特殊情況。 – Pimgd 2012-02-14 18:37:24