@LazyCollection(LazyCollectionOption.FALSE)和@OneToMany(fetch = FetchType.EAGER)之间的区别

Gil*_*dré 16 java jsf hibernate lazy-loading

我对"懒惰加载"有一个疑问.使用@LazyCollection(LazyCollectionOption.FALSE)和有@OneToMany(fetch = FetchType.EAGER)什么区别 ?

在我的应用程序中,我使用两个列表,但如果我使用这种格式:

@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;


@OneToMany(mappedBy = "consulta", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<Contato> contatos;
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

引起:org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

我知道这是因为Hibernate不允许我同时加载两个列表.但如果我使用这种格式:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consulta", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<Contato> contatos;
Run Code Online (Sandbox Code Playgroud)

它完美地运作.

对不起我的英文谢谢

Mag*_*lex 12

注释之间的根本区别在于@OneToMany它的参数(例如fetch = FetchType.EAGER)是纯粹的JPA.它可以与任何JPA提供程序一起使用,例如Hibernate或EclipseLink.

@LazyCollection 另一方面,Hibernate是特定的,显然只有在使用Hibernate时才有效.

如果可能的话,尽可能地坚持JPA规范.通过这样做,您应该能够轻松切换提供商(至少在理论上).

至于你真正的问题,可能是你正在使用不支持JPA 2.0的Hibernate版本,正如这个答案所暗示的那样?