2012-12-11 76 views
2

我有兩個類,CalculatedValue和Price。價格有CalculatedValue的地圖。每個CalculableValue實例都有其他字段的名稱,值和一對。JPA SortedMap映射 - 避免兩列與鍵

這裏是我的映射用來描述價格和CV之間的依賴關係:

@OneToMany(
     cascade = CascadeType.ALL, 
     fetch = FetchType.EAGER 
) 
@JoinColumn(name = "priceId") 
private Map<String, CalculatedValue> calculatedValues = 
     new TreeMap<String, CalculatedValue>(); 

沒有連接表,只是priceId列映射是指對物價的唯一ID。

這裏是生成的表的樣子:

CREATE TABLE PUBLIC.CALCULATEDVALUE( UNIQUEID BIGINT NOT NULL, KEY VARCHAR(2147483647)NOT NULL, PRICEID BIGINT, VALUE DOUBLE NOT NULL, CALCULATEDVALUES_KEY VARCHAR(2147483647), PRIMARY KEY(UNIQUEID) );

ALTER TABLE PUBLIC.CALCULATEDVALUE 添加外鍵(PRICEID) 參考TEST.PUBLIC.PRICE(UNIQUEID);

一切工作,但我想知道是否可以這樣:

  1. 避免自動「CALCULATEDVALUES_KEY」欄目創作。我已經將這個值存儲在KEY列中,並且避免重複並以某種方式向JPA提供提示會很好。
  2. 觸發級聯刪除每個刪除價格的計算值(如果我正在運行SQL刪除語句)
  3. 這樣的映射工作,以防萬一我將使用日期作爲關鍵?不是針對這個特定的領域,而是針對其他一些領域,這將是有用的。假設相同的OneToMany關係。

提前致謝!

PS。我使用最新版本的EclipseLink & H2作爲數據庫。 PPS。不想將可計算值存儲在數組中,因爲我需要經常在Java中找到它的購買密鑰。

回答

1

在Google地圖上看到的信息,

http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

,並

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Maps

,並

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_cascadeondelete.htm#CIABIIEB

的幾個問題:

  • EclipseLink將默認使用Hashtable作爲Map,如果你想要它使用TreeMap,你需要將該字段定義爲TreeMap。
  • 不要給@OneToMany @JoinColumn,這隻支持高級單向@OneToMany,正常的@OneToMany應該使用mappedBy並且在目標實體中有一個反@ManyToOne。(這將解決您的重複外鍵問題)。
  • 您需要爲地圖指定@MapKey,否則它默認爲id,在這裏它似乎是一個整數,而不是字符串。
  • 您可以在EclipseLink中使用@CascadeOnDelete對數據庫進行級聯刪除。
+0

感謝您的回答。 下面是我有它現在描述: 艙位價格: @OneToMany( 級聯= CascadeType.ALL, 取= FetchType.EAGER, 的mappedBy = 「價格」 ) 私人地圖<字符串,CalculatedValue > calculatedValues = new TreeMap (); CalculatedValue類: @ManyToOne(取= FetchType.LAZY) @JoinColumn(name = 「priceId」) 私人價格的價格; – Val

+0

兩個問題: 1)priceId列已生成,但未自動填充。 有什麼辦法讓它自動填充? 我想我需要一些簡單的OneToMany + JoinColumn從我的第一個例子,不需要手動填充反向引用。 2)我仍然有自動生成的CALCULATEDVALUES_KEY列。 有沒有什麼辦法可以避免並幫助JPA瞭解我已經有一個存儲在KEY列中的密鑰? – Val

+0

試圖使用TreeMap而不是Map,並且eclipselink會生成一個錯誤 - 此映射的屬性類與集合類不匹配。 [類java.util.Hashtable]不能被分配給[類java.util.TreeMap]。試圖找到什麼eclipselink支持,但沒有運氣的信息......不知道如果我想切換到休眠.. – Val