【问题标题】:Correct way to remove object from @ManyToMany list从@ManyToMany 列表中删除对象的正确方法
【发布时间】:2012-01-29 01:36:41
【问题描述】:

我用同一个实体创建了关系@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. 如果是这样,我怎么知道我需要刷新哪个好友列表?

编辑:在我看来,我也应该删除 (cascade = CascadeType.ALL),因为当我删除 u1 时,会删除所有配对成员。这是正确的行为吗?

【问题讨论】:

    标签: java jpa persistence eclipselink


    【解决方案1】:

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

    另外,如果你只想结束2个User之间的关系,你应该使用u1.getFriends().remove(u3)

    最后,如果您想删除用户。您应该创建一个EntityManager em 并执行命令em.remove(u3)。此命令将删除 u3 以及关系。但是,您应该小心cascade = CascadeType.ALL。这个 cascadeType 意味着如果你移除 u3,u1 也会被移除。我认为你应该把它留给@ManyToMany,不要级联。

    【讨论】:

    • 我已经删除了所有级联。在删除时,我使用 EntityManager em.remove(u)。但它并没有像我预期的那样工作,因为在 em.remove(u3) 之后,当我检查数据库时(由 MySQL 管理员),u3 不存在,但它仍然存在于 u1.friends 中。重启程序后消失。知道为什么这么晚吗?
    • 嗯,这很奇怪。我试图在我的应用程序中删除一个条目,并且所有关系都已正确更新。 ^^ 我认为你应该用这种奇怪的行为来更新你的问题。我相信其他人将能够帮助您解决此问题
    • 我确实喜欢我告诉你的。我打电话给em.remove('someEntity')
    • 嗯我认为你不应该在Entity 中使用EntityManager。通常,您会将EntityManager 注入到 Enterprise JavaBean 中,然后您将使用该 bean 来持久化实体。
    • 在我看来,您应该了解 EJB。它将帮助您实现在 JavaEE 中非常流行的 MVC 架构。快速查看page 顶部的代码。将 EntityManger 注入到 EJB 中非常容易。
    【解决方案2】:

    我找到了另一个解决方案,但仅在我们使用 EclipseLink 时。

    在persistance.xml中你需要添加属性:

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

    然后一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多