在双向一对多JPA/Hibernate查询上创建交叉提取
以下是基本映射:在双向一对多JPA/Hibernate查询上创建交叉提取,hibernate,jpa,one-to-many,many-to-one,Hibernate,Jpa,One To Many,Many To One,以下是基本映射: Client { @OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.EAGER) private Set<Group> groups = new HashSet<Group>(); } Group { @ManyToOne (cascade=CascadeType.ALL) private Client client = new C
Client {
@OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Set<Group> groups = new HashSet<Group>();
}
Group {
@ManyToOne (cascade=CascadeType.ALL)
private Client client = new Client();
}
我到底做错了什么?这是因为fetch类型。Hibernate使用连接将组放入同一个查询中。这增加了客户机的数量 集合的联合抓取通常不是一个好主意。它有几个副作用。你刚找到一个
- 如果您想避免延迟加载,只需关闭lazy(我认为这是注释
)@LazyCollection(FALSE)
- 如果您不关心副作用:从查询中得到的成倍增加的客户机在内存中仍然是相同的实例。您可以将它们简化为不同实例的列表
- HQL实际上没有考虑这个选项。您需要显式地
它们加入fetch
- 如果您想避免延迟加载,只需关闭lazy(我认为这是注释
)@LazyCollection(FALSE)
- 如果您不关心副作用:从查询中得到的成倍增加的客户机在内存中仍然是相同的实例。您可以将它们简化为不同实例的列表
- HQL实际上没有考虑这个选项。您需要显式地
它们加入fetch
客户端的映射,如下所示:
Client {
@OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private Set<Group> groups = new HashSet<Group>();
}
客户端{
@OneToMany(mappedBy=“client”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私有集组=新HashSet();
}
从API文档中
您可以主动或被动地获取相关实体。fetch参数可以设置为FetchType.LAZY或FetchType.EAGER。EAGER将尝试使用外部连接选择来检索关联对象,而LAZY仅在第一次访问关联对象时触发选择@OneToMany和@ManyToMany关联默认为懒惰,@OneToOne和@ManyToOne关联默认为渴望。
有关更多详细信息,请阅读API文档 修改客户端的映射,如下所示
Client {
@OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private Set<Group> groups = new HashSet<Group>();
}
客户端{
@OneToMany(mappedBy=“client”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私有集组=新HashSet();
}
从API文档中
您可以主动或被动地获取相关实体。fetch参数可以设置为FetchType.LAZY或FetchType.EAGER。EAGER将尝试使用外部连接选择来检索关联对象,而LAZY仅在第一次访问关联对象时触发选择@OneToMany和@ManyToMany关联默认为懒惰,@OneToOne和@ManyToOne关联默认为渴望。
有关更多详细信息,请阅读API文档