Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在双向一对多JPA/Hibernate查询上创建交叉提取_Hibernate_Jpa_One To Many_Many To One - Fatal编程技术网

在双向一对多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
    它们

这是因为获取类型为“渴望”。Hibernate使用连接将组放入同一个查询中。这增加了客户机的数量

集合的联合抓取通常不是一个好主意。它有几个副作用。你刚找到一个

  • 如果您想避免延迟加载,只需关闭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文档