nfd*_*ort 9 java many-to-many jpa scalability
我有一个Group实体,它具有多对多关系中的User实体列表.它由包含两个ID的典型连接表映射.此列表可能非常大,一组中有一百万或更多用户.
我需要向该组添加一个新用户,通常会是这样的
group.getUsers().add(user);
user.getGroups().add(group);
em.merge(group);
em.merge(user);
Run Code Online (Sandbox Code Playgroud)
如果我了解典型的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>();
}
Run Code Online (Sandbox Code Playgroud)
这样做。
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2976 次 |
| 最近记录: |