我有以下的商業模式:映射多個包含HashMap在JPA
膳食 - 包含名稱和價格
菜單 - 包含名稱和它們的量的套餐和替代價格(通常低於默認價格)。
在過去,我已經使用HashMap<Entity, Value>
解決了類似的問題。在這種情況下,我有兩個值:價格和金額。由於Java和JPA不支持multimaps,我決定使用兩個包含相同密鑰的HashMaps。
@Entity
public class Menu {
@Column
private String name;
@ElementCollection
@CollectionTable(name = "MENU_MEALS", joinColumns = @JoinColumn(name = "MENU_ID"))
@MapKeyJoinColumn(name = "MEAL_ID", referencedColumnName = "ID")
@Column(name="AMOUNT")
private Map<Meal, BigDecimal> amounts = new LinkedHashMap<Meal, BigDecimal>();
@ElementCollection
@CollectionTable(name = "MENU_MEALS", joinColumns = @JoinColumn(name = "MENU_ID"))
@MapKeyJoinColumn(name = "MEAL_ID", referencedColumnName = "ID")
@Column(name="PRICE")
private Map<Meal, BigDecimal> prices = new LinkedHashMap<Meal, BigDecimal>();
}
生成的表格看起來很好:MENU_ID,MEAL_ID,AMOUNT,PRICE。
我添加新的餐的菜單是這樣的(在我的實體內的方法),我做到這一點,而它的分離(不想存儲餐DB馬上 - GUI預覽至上):
menu.prices.add(meal, price);
menu.amounts.add(meal, amount);
在向分離的菜單添加足夠的餐點並單擊「確定」按鈕後,我的菜單被合併。
的em.merge(menu)
操作映射到SQL語句:
insert into MENU_MEAL (MENU_ID, MEAL_ID, PRICE) values (?, ?, ?)
insert into MENU_MEAL (MENU_ID, MEAL_ID, AMOUNT) values (?, ?, ?)
而這就是問題。我得到一個主鍵約束違例異常。第二個調用應該更新(MENU_ID,MEAL_ID)條目,而不是嘗試插入一個具有相同外鍵的新條目。
任何建議如何強制它做「update-if-exists-insert-otherwise」?
我已經通過將每個HashMap映射到不同的表來臨時解決了這個問題。但我不喜歡這個解決方案。
編輯:我需要我的合併,以這樣的表現:
insert into MENU_MEAL (MENU_ID, MEAL_ID, PRICE) values(?, ?, ?) on duplicate key update PRICE=values(price)
任何想法如何實現這一目標?
我很高興它現在可以工作,但我同意這不是最好的解決方案。在7個小時內(是的,漫長的一天),我可以爲你研究這個。也許我可以爲你找到更乾淨的東西。 – Joetjah 2013-02-14 10:57:28