Hibernate-只为许多人加载代理
我有两个由联接表联接的表:Hibernate-只为许多人加载代理,hibernate,many-to-many,jointable,Hibernate,Many To Many,Jointable,我有两个由联接表联接的表: @实体 @表(name=“a”) 公共A类{ @身份证 @列(name=“id”,unique=true,nullable=false) 私人长id; @多个(目标实体=B类) @JoinTable(name=“a\u b\u join”,joinColumns=@JoinColumn(name=“a\u id”),inverseJoinColumns=@JoinColumn(name=“b\u id”)) 私有集bs=新HashSet(); } @实体 @表(na
@实体
@表(name=“a”)
公共A类{
@身份证
@列(name=“id”,unique=true,nullable=false)
私人长id;
@多个(目标实体=B类)
@JoinTable(name=“a\u b\u join”,joinColumns=@JoinColumn(name=“a\u id”),inverseJoinColumns=@JoinColumn(name=“b\u id”))
私有集bs=新HashSet();
}
@实体
@表(name=“b”)
公共B级{
@身份证
@列(name=“id”,unique=true,nullable=false)
私人长id;
}
数据库中有大量的a和相对较少的B。大多数A只有一个B,但可以有几个。对于A的任何给定结果集,只有少数几个不同的B。急切地加载多对多会导致相同的B被一次又一次地获取。我要做的是让Hibernate从初始SELECT上的join表中获取A的B的所有ID,并用代理填充“B”集合。那么每个B在会话中只提取一次
对于我的应用程序来说,另一种可行的方法是从联接表中加载一组B id。我认为这是不可能的
另一种方法是将联接表映射为一个实体(让我们调用is
ABJoin
),用一个以集合
为目标的OneToMany替换多个,然后立即获取该集合。因此,您将拥有一组加载的ABJoin,每个ABJoin都有一个未初始化的B代理。这正是我在等待响应时决定实现的。我通常不喜欢为联接表创建实体类,但这就是目的。
@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;
}