我想用JPA Annotations定义我的@ManyToMany关系,以便在更新实体时不会删除关系。
@ManyToMany(targetEntity=Event.class, cascade={CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinTable(
name = "event_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "event_id")
)
private Set<Event> events;
和事件类
@ManyToMany(cascade = {CascadeType.ALL}, mappedBy="events", targetEntity=User.class, fetch = FetchType.LAZY)
private Set<User> attending;
我认为设置CascadeType.REMOVE在更新时不会触发删除,但是当我在用户对象上调用update时,会删除所有相关事件。
这是我的DAO
@Override
public User update(User entity) {
sessionFactory.getCurrentSession().update(entity);
return entity;
}
当我在我的实体上调用update时,Hibernate会这样做:
Hibernate: delete from event_user where user_id=?
答案 0 :(得分:1)
到目前为止,您对问题的评论是正确的。在更新之前,您显然不会从数据库加载实体。因此,hibernate会更新所有内容,就像它在您的实体中找到它一样。因此,加载实体(通过id?),合并您的更改并在之后更新它。
顺便说一句,您还应该考虑使用删除孤儿注释。因此,在将事件集合设置为null时,不仅要在删除整个用户时,还要确保删除用户的事件。