0

我有两个由连接表连接的表:

@Entity
@Table( name = "a" )
public class A {
    @Id
    @Column( name = "id", unique = true, nullable = false )
    private long id;

    @ManyToMany( targetEntity = B.class )
    @JoinTable( name = "a_b_join", joinColumns = @JoinColumn( name = "a_id" ), inverseJoinColumns = @JoinColumn( name = "b_id" ) )
    private Set<B> bs = new HashSet<B>();
}

@Entity
@Table( name = "b" )
public class B {
    @Id
    @Column( name = "id", unique = true, nullable = false )
    private long id;
}

数据库中有大量的A,而B 的数量相对较少。大多数 A 只有一个 B,但可能有几个。对于任何给定的 A 的结果集,将只有少数不同的 B。急切地加载多对多将导致一次又一次地获取相同的 B。我想要做的是让 Hibernate 从初始 SELECT 的连接表中获取 A 的 B 的所有 id,并用代理填充“bs”集合。那么每个 B 只会在会话中被获取一次。

一种适用于我的应用程序的替代方法是以某种方式急切地从连接表中加载 B id 的集合。

4

1 回答 1

1

我不认为这是可能的。

另一种方法是将连接表映射为实体(我们称之为 is ABJoin),将 ManyToMany 替换为针对 a 的 OneToMany Set<ABJoin>,然后急切地获取该集合。因此,您将拥有一组加载的 ABJoin,每个都有一个未初始化的 B 代理。

于 2013-05-31T22:04:03.163 回答