2013-06-01 227 views
0

我在我的代碼有拖表(用戶和工作)之間的關係@ManyToMany如下:休眠@ManyToMany保存

... 
public class User implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 
@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(name = "USER_WORK", joinColumns = { 
    @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { 
     @JoinColumn(name = "WORK_ID") 
}) 
@Cascade({CascadeType.ALL}) 
private Set<Work> works; 
... 

,當我想影響一個新的工作給用戶的執行以下代碼:

... 
addWorkToUser(Work work,Integer idUser){ 
    User user = new User(); 
    user.setId(idUser); 
    Set<Work> worksList = new HashSet<Work>(); 
    worksList.add(work); 
    user.setWorks(worksList); 
     getHibernateTemplate().saveOrUpdate(User) 
} 
    ... 

問題是,當我第一次影響新作品時一切順利。但是,當我影響到一個新的炒鍋給同一個用戶,我只看到最後的工作! 當我調試代碼時,我發現刪除查詢。 如何跳過這個刪除查詢?

Hibernate: update User set name=? where id=? 
Hibernate: delete from USER_WORK where USER_ID=? 
Hibernate: insert into USER_WORK (USER_ID, WORK_ID) values (?, ?) 

編輯

我通過手動執行該解決該問題得到, 但我仍然在尋找最佳的解決方案 :(

User User = (User) DataAccessUtils 
      .singleResult((getHibernateTemplate().find(
        "From User WHERE id = ?", idUser))); 
    User.getWorks().add(work); 
    getHibernateTemplate().saveOrUpdate(User); 

回答

1

每次添加時間一個已經存在於數據庫中的用戶的工作,創建一個新的用戶(儘管它已經存在),爲其分配一組包含單個元素的工作,然後用第新的一個。當然,結果是現有的一組作品被包含單個元素的新作品取代。

您不應該創建一個新用戶,因爲它已經存在於數據庫中。取而代之的是,從數據庫中獲取的現有用戶和新的工作加入到他的一套作品:

// if the work isn't persistent yet: 
session.persist(work); 

User user = (User) session.get(User.class, idUser); 
user.addWork(work); 
// nothing else needed 
+0

我改變我的代碼如下:。 會話的會話= getHibernateTemplate()了getSessionFactory()的getCurrentSession()。 ; session.beginTransaction(); User User =(User)session.get(User.class,idUser); Set groupsList = new HashSet (); groupsList.add(group); User.setGroups(groupsList); getHibernateTemplate()。saveOrUpdate(User); session.close(); 但我仍然有同樣的問題 – z4k4r14

+0

因爲你仍然用一個新的包含一個單一的工作取代集合。您必須將作品添加到用戶擁有的作品集中。不能用新的替換。 。'user.getGroups()加(主持工作);'。當你爲你的錢包添加一個硬幣時,你不會構造一個新的錢包,將硬幣放入新的錢包,並用新的錢包取代你的口袋裏的錢包。你把你現有的錢包放在你的口袋裏,已經裝有硬幣,並在裏面加入新硬幣。同樣在這裏。 –

+0

我嘗試過,但它不適合我。 。 我嘗試用流動的功能: 公共無效addWorkToUser(工作工作,整數ID用戶){ \t \t會話的會話= getHibernateTemplate()了getSessionFactory()的getCurrentSession(); \t \t session.beginTransaction(); \t \t User User =(User)session.get(User.class,idUser); \t \t session.saveOrUpdate(work); \t \t User.getGroups()。add(work); \t \t會議。saveOrUpdate(用戶); \t \t session.flush(); \t \t session.close(); } – z4k4r14