0

我有一个对象,它有一个使用 ManyToMany 映射的集合。该集合可以是相当大的数十万个整体。当我想向集合中添加成员时,JPA 会在添加新条目之前撤回集合中的每个对象。

@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "ROOM_USER",
            joinColumns = @JoinColumn(name = "ROOM_ID"),
            inverseJoinColumns = @JoinColumn(name = "USER_ID"))
private Set<User> members;

稍后在服务类中,我想将用户添加到集合中,如下所示

    room.addMember(user);

由于关系被声明为惰性,因此当我在房间上调用 addMember 时,代理会获取成员集。这里的问题是当集合变大时,检索成员集合需要相当长的时间。在这种情况下,索引工作正常,我检查了 mysql 中的查询,问题很简单,它提取了大量数据,而我真正想要的只是将行添加到 ROOM_USER 连接表中。

JPA 是否定义了一种将成员添加到集合而不拉回整个集合的方法?

其他一些注意事项我正在使用 Spring 框架和 Hibernate 来实现 JPA。

4

2 回答 2

0

我想出的解决方案是创建另一个表示连接的对象,称为 UserRoom。然后我创建了一个相应的服务,允许我直接向该表添加行。

    @Entity
    @Table("USER_ROOM")
    public class UserRoom {

         @Id
         private Long id;

         @ManyToOne(fetch=FetchType.EAGER)
     @JoinColumn(name="USER_ID")
         private User user;

         @ManyToOne(fetch=FetchType.EAGER)
     @JoinColumn(name="ROOM_ID") 
         private Room room;
}

希望这对将来的某些人有所帮助。

于 2014-04-11T13:40:35.030 回答
0

最简洁的答案是不。访问集合后,惰性集合映射将立即初始化。没有规定访问集合的子集。

一般来说,非常大的集合不是这种关联的好候选者,这正是您所看到的原因。

但是,有一些非 JPA 扩展允许额外的惰性映射,即每个条目的初始化。这里有更多内容

于 2012-10-08T16:34:36.817 回答