从@ManyToMany列表中删除对象的正确方法

时间:2011-12-28 09:46:49

标签: java jpa persistence eclipselink

我用同一个实体创建了关系@ManyToMany。

这是我的实体:

@Entity
@Table(name = "user")
public class User extends BaseEntity implements Serializable {

...

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "table_friends", joinColumns =
@JoinColumn(name = "userId"), inverseJoinColumns =
@JoinColumn(name = "friendId"))
private List<User> friends;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "table_friends", joinColumns =
@JoinColumn(name = "friendId"), inverseJoinColumns =
@JoinColumn(name = "userId"))
private List<User> friendsof;

我创建了一些“用户”并将其添加到好友列表中:

User u1 = new User();
User u2 = new User();
User u3 = new User();

u1.getFriends().add(u2);
u1.getFriendsof().add(u2);
u1.getFriends().add(u3);
u1.getFriendsof().add(u3);

当我从列表u1.getFriends().remove(u3)中删除朋友时,一切正常。但是当我想从数据库u3.remove()中删除用户时,u1的朋友仍然是相同的,虽然已经在朋友的数据库列表中是正确的。

  1. 删除用户后,我可以以某种方式刷新列表吗?
  2. 如果是这样,我怎么知道我需要刷新哪个朋友名单?
  3. 编辑:在我看来,我应该删除(cascade = CascadeType.ALL),因为当我删除u1时,删除所有配对成员。这是正确的行为吗?

2 个答案:

答案 0 :(得分:3)

嗯,为什么你需要2个列表friendsfriendsOf?如果你是我的朋友,我不是很明显我是你的朋友吗?

此外,如果您只想结束2 User之间的关系,则应使用u1.getFriends().remove(u3)

最后,如果您要删除用户。您应该创建EntityManager em并执行命令em.remove(u3)。此命令将删除u3以及关系。但是,您应该对cascade = CascadeType.ALL小心。此cascadeType表示如果删除u3,u1也将被删除。我认为你应该保留@ManyToMany而不是级联。

答案 1 :(得分:0)

我找到了另一个解决方案,但只有在我们使用EclipseLink时才会发现。

在persistence.xml中,您需要添加属性:

<property name="eclipselink.cache.shared.default" value="false"/>

然后一切正常。