0

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

1 回答 1

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
于 2013-06-01T18:31:56.980 回答