Relacionamento Lazy com Ajax

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]

Por que você acha que join fetch é POG? O.o

Existem poucas maneiras de contornar o problema, e pessoalmente, eu sempre escolho essa. O.o

[quote=Hebert Coelho]Por que você acha que join fetch é POG? O.o

Existem poucas maneiras de contornar o problema, e pessoalmente, eu sempre escolho essa. O.o[/quote]

Eu tbm costumo utilizar, porém faço a pesquisa com criteria

[quote=Hebert Coelho]Por que você acha que join fetch é POG? O.o

Existem poucas maneiras de contornar o problema, e pessoalmente, eu sempre escolho essa. O.o[/quote]

Não sou experiente para dar uma resposta baseada em fatos. Eu estranho o fato de já ter os dados da entidade em mão e ter que fazer mais um select na mesma entidade para trazer os dados do lazy. Além do que, como vocês fazem com entidades que possuem dois relacionamentos lazy? Já tentei fazer um select com dois join fetch mas parece que isso não é suportado.

Vi alguns usuários mudando uma das listas de list para set, mas isso aí também me cheira POG! Sei que é raro mas podem ter entidades com três relacionamentos lazy, neste caso, como faz?

[quote=VagnerMG][quote=Hebert Coelho]Por que você acha que join fetch é POG? O.o

Existem poucas maneiras de contornar o problema, e pessoalmente, eu sempre escolho essa. O.o[/quote]

Não sou experiente para dar uma resposta baseada em fatos. Eu estranho o fato de já ter os dados da entidade em mão e ter que fazer mais um select na mesma entidade para trazer os dados do lazy. Além do que, como vocês fazem com entidades que possuem dois relacionamentos lazy? Já tentei fazer um select com dois join fetch mas parece que isso não é suportado.

Vi alguns usuários mudando uma das listas de list para set, mas isso aí também me cheira POG! Sei que é raro mas podem ter entidades com três relacionamentos lazy, neste caso, como faz?[/quote]Seu problema é achar que coisas são POG sem saber o porque.

Eu não tenho um objeto e busco outro, quando eu trago alguém que eu sei que vou precisar de uma lista, eu já faço o join fetch. Eu tenho uma query para cada caso:
select c from Car c join fetch c.casas
select c from Car c join fetch c.pessoas
select c from Car c join fetch c.casas join fetch c.pessoas

Eu apenas uso cada query onde for necessária e não fico dando voltas ao DB.

Quando ao de trocar set por list ao usar duas listas na consulta é coisa do hibernate. Esse post fala sobre ele: JPA: Mini Livro - Primeiros passos e conceitos detalhados. É um comportamento esperado dele e existe mais mais de um modo para corrigir isso, o mais fácil trocar de List para Set. [=

[quote=Hebert Coelho][quote=VagnerMG][quote=Hebert Coelho]Por que você acha que join fetch é POG? O.o

Existem poucas maneiras de contornar o problema, e pessoalmente, eu sempre escolho essa. O.o[/quote]

Não sou experiente para dar uma resposta baseada em fatos. Eu estranho o fato de já ter os dados da entidade em mão e ter que fazer mais um select na mesma entidade para trazer os dados do lazy. Além do que, como vocês fazem com entidades que possuem dois relacionamentos lazy? Já tentei fazer um select com dois join fetch mas parece que isso não é suportado.

Vi alguns usuários mudando uma das listas de list para set, mas isso aí também me cheira POG! Sei que é raro mas podem ter entidades com três relacionamentos lazy, neste caso, como faz?[/quote]Seu problema é achar que coisas são POG sem saber o porque.

Eu não tenho um objeto e busco outro, quando eu trago alguém que eu sei que vou precisar de uma lista, eu já faço o join fetch. Eu tenho uma query para cada caso:
select c from Car c join fetch c.casas
select c from Car c join fetch c.pessoas
select c from Car c join fetch c.casas join fetch c.pessoas

Eu apenas uso cada query onde for necessária e não fico dando voltas ao DB.

Quando ao de trocar set por list ao usar duas listas na consulta é coisa do hibernate. Esse post fala sobre ele: JPA: Mini Livro - Primeiros passos e conceitos detalhados. É um comportamento esperado dele e existe mais mais de um modo para corrigir isso, o mais fácil trocar de List para Set. [=[/quote]

Hebert, no caso do join fetch, você deve garantir que exista registros na relação MANY correto? Como resolver isso em casos onde eu preciso dos dados do lado “ONE” e se existir os dados do lado “MANY”, trazê-los também?

Inicializar a lista com o Hibernate.initialize?

Desculpe minha ignorância, mas quando é vantajoso trabalhar com OneToMany? Todo relacionamento 1:N você mapeia os dois lados?

Edit:Utilizei o left join fetch pra resolver o problema do 1:N quando não se tem garantia de registros do lado N. De toda forma, fica a pergunta de quando e sua vantagem de usar OneToMany

[quote=VagnerMG]Hebert, no caso do join fetch, você deve garantir que exista registros na relação MANY correto? Como resolver isso em casos onde eu preciso dos dados do lado “ONE” e se existir os dados do lado “MANY”, trazê-los também?

Inicializar a lista com o Hibernate.initialize?

Desculpe minha ignorância, mas quando é vantajoso trabalhar com OneToMany? Todo relacionamento 1:N você mapeia os dois lados?

Edit:Utilizei o left join fetch pra resolver o problema do 1:N quando não se tem garantia de registros do lado N. De toda forma, fica a pergunta de quando e sua vantagem de usar OneToMany[/quote]No link acima explica quando utilizar cada tipo de relacionamento.

Não existe caso onde é melhor OneToOne do que ManyToMany ou qualquer outra coisa, cada relacionamento foi criado para um tipo de situação.