我有一个 Group 实体,其中包含多对多关系中的 User 实体列表。它由包含两个 ID 的典型连接表映射。这个列表可能非常大,一个组中有一百万或更多的用户。
我需要向组中添加一个新用户,通常是这样的
group.getUsers().add(user);
user.getGroups().add(group);
em.merge(group);
em.merge(user);
如果我了解典型的 JPA 操作,这是否需要将超过 100 万用户的整个列表拉到集合中以便添加新用户然后保存?对我来说,这听起来不太可扩展。
我不应该在 JPA 中定义这种关系吗?在这种情况下,我应该直接操作连接表条目吗?
请原谅松散的语法,我实际上使用的是 Spring Data JPA,所以我并不经常直接使用实体管理器,但这个问题似乎对 JPA 来说很普遍,所以我想这样提出。
最佳答案
像这样设计您的模型并使用 UserGroup 进行关联。
@Entity
public class User {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user",fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<UserGroup> userGroups = new HashSet<UserGroup>();
}
@Entity
@Table(name="user_group",
uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "group_id"})})
public class UserGroup {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@ForeignKey(name = "usergroup_user_fkey")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id", nullable = false)
@ForeignKey(name = "usergroup_group_fkey")
private Group group;
}
@Entity
public class Group {
@OneToMany(cascade = CascadeType.ALL, mappedBy="group", fetch = FetchType.LAZY )
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<UserGroup> userGroups = new HashSet<UserGroup>();
}
这样做。
User user = findUserId(id); //All groups wont be loaded they are marked lazy
Group group = findGroupId(id); //All users wont be loaded they are marked lazy
UserGroup userGroup = new UserGroup();
userGroup.setUser(user);
userGroup.setGroup(group);
em.save(userGroup);
关于java - 在 JPA 中将实体添加到大型多对多关系中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18909259/