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

标签 java jpa many-to-many scalability

我有一个 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/

相关文章:

java - SWT 复合和组

entity-framework - Entity Framework 代码首先是多对多

Laravel Eloquent ORM - 多对多删除剩余的数据透视表值

mysql - Ruby on Rails 使用 WHERE 子句丰富了许多 :many,

java - 为什么不允许未签名的小程序创建自定义类加载器?

java - 比较日期以查找匹配的年份和月份

java - 无法将 double 值转换为 boolean 值(这里是菜鸟)

java - 如何实现姓名和出生年份的验证

java - 如何使用 JPA 注释注释 MYSQL 自动增量字段

hibernate - h2 的故障转移@Type?