在JPA中将实体添加到大型多对多关系中

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的一般问题所以我想这样做.

Pra*_*ran 4

像这样设计你的模型并使用 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)