2009-06-03 100 views
5

我的團隊有兩個類,UserStore,由JPA @ManyToMany註釋相關。相關代碼如下。JPA @ManyToMany寫作創建但不更新

當創建一個新的User對象並設置其商店時,生活是美好的。但是當我們通過我們的Struts 2/Spring Web UI嘗試更新用戶對象時,我們發現了一些意外的行爲。 (通過JUnit運行簡單的自動化集成測試時,不會發生這些問題)。

簡單地說,當保存User時,它的存儲集合沒有更新 - 數據庫沒有顯示更改,並且有問題的User對象的重新加載顯示它有一組未更改的存儲。

我們發現這個問題的唯一解決方案 - 我們不喜歡這個解決方案,它讓我們團隊中的所有開發人員都有點不安 - 創建一個新的SetStore s,然後做user.setStores(null),然後做user.setStores(stores)

我們使用的是OpenEntityManagerInViewFilter;我們使用Hibernate作爲我們的JPA提供者;我們使用Spring的JpaTransactionManager。我們的代碼中沒有任何@Transactional註釋,並且由於其他地方描述的代理行爲,添加它們會破壞現有代碼。

任何人都可能提供有關我們如何以非噁心方式解決此問題的見解,這是值得歡迎的。


User.java的相關部分:

@ManyToMany 
@JoinTable(name = "company.user_store_access", 
     joinColumns = @JoinColumn(name = "userid"), 
     inverseJoinColumns = @JoinColumn(name = "storeid")) 
public Set<Store> getStores() { 
    return stores; 
} 

Store.java的相關部分:

UserDetailAction.java的
@ManyToMany(mappedBy = "stores") 
    public List<User> getUsers() { 
     return users; 
    } 

相關部分: (道直通向下的層或兩個,然後:)

entity = getEntityManager().merge(entity); 
+1

您可以在添加/修改商店的地方添加代碼行嗎? – 2009-06-04 06:36:14

回答

1

請嘗試以下標註在您的用戶對象:

@ManyToMany(cascade = {CascadeType.ALL}) 
+0

我會在早上嘗試一下 - 儘管我們已經添加了 @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE}) 已經。 – 2009-06-04 00:38:16

6

的問題是,你有一個雙向的關係,在這種情況下,是控制其他的,並從你的映射控制一個實體一個是商店實體,而不是用戶,所以添加用戶到商店將工作(因爲商店是誰控制),但添加一個商店的用戶不會。

嘗試通過將@ManyToMany(mappedBy =「users」)註釋放在getStores()方法並更改getUsers()之一來使User對象成爲控制關係的人來顛倒這種情況。

希望它有幫助。

P.S.控制關係的實體始終是沒有mappedBy屬性的實體。

2

我剛剛遇到同樣的問題,並在另一頁上找到解決方案。

這裏是爲我

調用getJpaTemplate工作()。刷新()調用之前已合併爲我工作。

我沒有得到它工作的原因。