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);
我改變我的代碼如下:。 會話的會話= 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
因爲你仍然用一個新的包含一個單一的工作取代集合。您必須將作品添加到用戶擁有的作品集中。不能用新的替換。 。'user.getGroups()加(主持工作);'。當你爲你的錢包添加一個硬幣時,你不會構造一個新的錢包,將硬幣放入新的錢包,並用新的錢包取代你的口袋裏的錢包。你把你現有的錢包放在你的口袋裏,已經裝有硬幣,並在裏面加入新硬幣。同樣在這裏。 –
我嘗試過,但它不適合我。 。 我嘗試用流動的功能: 公共無效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