2

我想用 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;
}

当我对我的实体调用更新时,Hibernate 会:

Hibernate: delete from event_user where user_id=?
4

1 回答 1

1

到目前为止,对您的问题的评论是正确的。您显然不会在更新之前从数据库中加载实体。因此,hibernate 更新所有内容,就像它在您的实体中找到它一样。因此,加载实体(通过 id?),合并您的更改并在之后更新它。

顺便说一句,您还应该考虑使用 delete orphans 注释。因此,您将确保在将事件集合设置为 null 时也将删除用户的事件,而不仅仅是在删除整个用户时。

于 2013-08-09T07:48:24.490 回答