我用同一个实体创建了关系@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的朋友仍然是相同的,虽然已经在朋友的数据库列表中是正确的。
编辑:在我看来,我应该删除(cascade = CascadeType.ALL),因为当我删除u1时,删除所有配对成员。这是正确的行为吗?
答案 0 :(得分:3)
嗯,为什么你需要2个列表friends
和friendsOf
?如果你是我的朋友,我不是很明显我是你的朋友吗?
此外,如果您只想结束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"/>
然后一切正常。