Hibernate - Eager只为很多人加载代理

时间:2013-05-31 21:55:38

标签: hibernate many-to-many jointable

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

@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;
}

@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'Collection。然后每个B只会在会话中被提取一次。

对我的应用程序有用的替代方法是以某种方式从连接表中加载一个BID集合。

1 个答案:

答案 0 :(得分:1)

我认为这不可能。

另一种方法是将连接表映射为实体(让我们调用ABJoin),将OneToMany替换为目标为Set<ABJoin>的OneToMany,并急切获取此设置。因此,您将拥有一个加载的ABJoin集合,每个集合都有一个非初始化的代理B。