Olá pessoal, tudo bem?
Há algumas semanas estou martelando bem em relação a melhor forma de trabalhar com Lazy!
Já entendi o porque das exceções e tudo mais.
Eis um problema clássico dos combos aninhados Estado/Cidade. Como é a melhor forma de trabalhar tendo este esquema aqui:
UF
@Entity
@Table(name="ufs")
public class UF implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer idUF;
@Column(length=2)
private String uf;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy = "uf")
private List<Municipio> listaMunicipios;
}
Municipio
@Entity
@Table(name="municipios")
public class Municipio implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer idMunicipio;
@Column(length=35)
private String municipio;
@ManyToOne
@JoinColumn(name = "Ufs_idUf")
private UF uf;
}
Página xhtml
[code]<p:outputLabel for=“combo-uf” value=“Estado:” />
<p:selectOneMenu id=“combo-uf” value="#{obraController.uf}"
converter=“converterUF” filterMatchMode=“startsWith”
filter=“true” requiredMessage=“Estado: campo obrigatório”
required=“true”>
<f:selectItem itemLabel="Selecione o estado" />
<f:selectItems value="#{obraController.listaUFs}" var="uf"
itemValue="#{uf}" itemLabel="#{uf.uf}" />
<p:ajax event="change"
listener="#{obraController.atualizaMunicipio}"
update="combo-municipio,:ajax-message:message" />
</p:selectOneMenu>
<p:outputLabel for="combo-municipio" value="Município:" />
<p:selectOneMenu id="combo-municipio"
value="#{obraController.obra.municipio}"
converter="converterMunicipio" filter="true"
filterMatchMode="startsWith" required="true"
requiredMessage="Município: campo obrigatório">
<f:selectItem itemLabel="Selecione a cidade" />
<f:selectItems value="#{obraController.uf.listaMunicipios}"
var="municipio" itemValue="#{municipio}"
itemLabel="#{municipio.municipio}" />
</p:selectOneMenu>[/code]
ManagedBean
public void atualizaMunicipio(AjaxBehaviorEvent event) {
try {
this.uf = new UFDaoImp().getUFWithJoinFetch(this.uf.getIdUF());
} catch (BusinessException e) {
FacesContext.getCurrentInstance().addMessage(
null,
new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso!", e
.getMessage()));
}
}
Qual a melhor maneira de fazer isso utilizando ajax?
Open Session in View? Já tentei de várias formas, mas não consigo fazer isso funcionar com AJAX. Hoje estou utlizando join fetch. Não sei se é a melhor maneira de implementar isso mas é o que está funcionando. Estou sentindo que a maneira de contornar o problema está meio POG.
UFDao
[code] @Override
public UF getUFWithJoinFetch(Integer idUF) throws BusinessException {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
try {
UF uf = (UF) session
.createQuery(
"from UF uf "
+ “join fetch uf.listaMunicipios where uf.idUF = :idUF”)
.setParameter(“idUF”,idUF).uniqueResult();
t.commit();
return uf;
} catch (Exception e) {
t.rollback();
throw new BusinessException(
“Erro no banco de dados! Contacte o Administrador!”);
} finally {
session.close();
}
}[/code]