我的代码中的两个表(用户和工作)之间有@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);
答案 0 :(得分: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