我有两个由连接表连接的表:
@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集合。
答案 0 :(得分:1)
我认为这不可能。
另一种方法是将连接表映射为实体(让我们调用ABJoin
),将OneToMany替换为目标为Set<ABJoin>
的OneToMany,并急切获取此设置。因此,您将拥有一个加载的ABJoin集合,每个集合都有一个非初始化的代理B。