2013-07-29 62 views
1

我试图强制HQL加载所有Lazy属性。 使用FETCH给我提供了“多行包”异常,我无法将其更改为Set,因为它们在其他地方被引用。我尝试了其他映射注释,但没有运气。 “FETCH ALL PROPERTIES”被忽略,没有任何东西被加载。我从来不明白它到底做了什么。很明显,当JSF尝试读取列表时,我得到“无法初始化懒惰列表。连接关闭”如何强制加载HQL

我正在使用Hibernate 4.0。 因此,这里是我的HQL查询:

Select r from Responsavel r FETCH ALL PROPERTIES 
where r.unidadeEmpresarial.id = :idUnidade 

这是我的模型类:

public class Responsavel { 

@Id 
@SequenceGenerator(name = "SQ_RESPONSAVEL_GENERATOR", sequenceName = "SE_RESPONSAVEL", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_RESPONSAVEL_GENERATOR") 
@Column(name = "SQ_RESPONSAVEL") 
private Long id; 

@Temporal(TemporalType.DATE) 
@Column(name = "DT_FIM") 
private Date dataFim; 

@NotNull 
@Temporal(TemporalType.DATE) 
@Column(name = "DT_INICIO") 
private Date dataInicio; 

@Temporal(TemporalType.DATE) 
@Column(name = "DT_NASCIMENTO") 
private Date dataNascimento; 

@Type(type = "org.hibernate.type.NumericBooleanType") 
@Column(name = "IN_PODER_ADM_REPRES") 
private Boolean temPoderAdministrativo; 

@Column(name = "NO_RESPONSAVEL") 
private String nome; 

@Column(name = "NU_CPF_CNPJ_RESPONSAVEL") 
private String numeroCpfCnpj; 

@NotNull 
@Enumerated(EnumType.STRING) 
@Column(name = "TP_PESSOA") 
private String tipoPessoa; 

@ManyToOne 
@JoinColumn(name = "SQ_PAIS") 
private Pais pais; 

@Column(name = "VL_CAPITAL_SOCIAL") 
private BigDecimal valorCapitalSocial; 

@Column(name = "PC_CAPITAL_SOCIAL") 
private BigDecimal percentualCapitalSocial; 

@ManyToOne 
@JoinColumn(name = "SQ_UNIDADE_EMPRESARIAL") 
private UnidadeEmpresarial unidadeEmpresarial; 

@OneToMany(mappedBy = "responsavel", fetch = FetchType.LAZY) 
@Fetch(FetchMode.SUBSELECT) 
private Set<ResponsavelQualificacaoResponsavel> listaResponsavelQualificacaoResponsavel; 

@OneToMany(mappedBy = "responsavel") 
private List<Representante> representantes; 

@OneToMany(mappedBy = "responsavel") 
private List<ContatoResponsavel> contatoResponsavel; 

@OneToMany(mappedBy = "responsavel", cascade = CascadeType.ALL) 
private List<EnderecoResponsavel> enderecoResponsavel; 

} 

感谢

+0

也许我误解了,但不能改变你的模型类映射注释上的获取类型为EAGER(fetch = FetchType.EAGER)? – Cody

回答

1

如果你所得到的多个袋子的例外,那是因为Hibernate无法得到所有的您的收藏一次。你应该选择一个你希望用你的基本查询选择的集合,然后使用Hibernate.initialize来获得你需要的其他集合。

因此,它应该是这样的(我离开关选择,因为它不是必需的):

from Responsavel r 
join fetch pais p 
join fetch unidadeEmpresarial u 
join fetch representantes s 
where r.unidadeEmpresarial.id = :idUnidade 

您可以尝试使用哪些包含。剩下的,如果你想从Hibernate会话中分离出来,需要初始化,例如,使用前端或服务类中的集合。

Hibernate.initialize(listaResponsavelQualificacaoResponsavel); 
Hibernate.initialize(contatoResponsavel); 
Hibernate.initialize(enderecoResponsavel); 

如果将剩余的会话,则无需初始化,他们将初始化需求(尽管这可能会导致性能问题,这取决于你的使用情况)。

+0

这是否对您有帮助?我可以得到更多帮助吗? –