Minha duvida consiste no seguinte:
Tenho uma classe Menu e outra MenuItem.
Gostaria que, ao trazer o Menu, a sua respectiva colection de menuitem seja preenchida sem que eu tenha q fazer uma nova busca.
Utilizei o Fetch no mapeamento vejam como ficou:
@OneToMany(mappedBy = "menuIdmenu",fetch=FetchType.EAGER)
public Collection<MenuItem> getMenuItemCollection() {
return menuItemCollection;
}
Mas ao fazer a seguinte consulta para o Menu:
public static List retornaTodos(Class cls) {
sessao = sfSessao.openSession();
List retorno = sessao.createCriteria(cls).list();
sessao.close();
return retorno;
}
Este esta trazendo o mesmo Menu duas vezes!!! :shock:
Alguem saberia me informa oq estou fazendo de errado??
Obrigado…
Veja se voce de fato nao tem itens duplicados, e que os relacionamentos estao certos. Menu tem o seu id, MenuItem tambem tem seu id unico, assim como uma FK para Menu. O Join gerado sera algo como
select
menu0_.id as id4_1_,
menu0_.nome as nome4_1_,
menuitems1_.menu_id as menu3_3_,
menuitems1_.id as id3_,
menuitems1_.id as id5_0_,
menuitems1_.menu_id as menu3_5_0_,
menuitems1_.nome as nome5_0_
from
Menu menu0_
left outer join
MenuItem menuitems1_
on menu0_.id=menuitems1_.menu_id
where
menu0_.id=?
O que tras os dados esperados, desde que as tabelas tambem estejam com dados corretos.
Rafael
Realmente, nao tenho ideia do que pode estar acontecendo…
o menu nao esta duplicado no banco jah verifiquei varias vezes…
caso alguem ainda tenha interesse em me ajuda, vou postar o mapeamento das duas classes.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idmenu", nullable = false)
private Integer idmenu;
@Column(name = "nome")
private String nome;
@Column(name = "imagem")
private String imagem;
@OneToMany(mappedBy = "menuIdmenu",fetch=FetchType.EAGER)
private Collection<MenuItem> menuItemCollection;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idmenu_item", nullable = false)
private Integer idmenuItem;
@Column(name = "nome")
private String nome;
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name = "menu_idmenu")
private Menu menuIdmenu;
@Column(name = "imagem")
private String imagem;
@Column(name = "descricao")
private String descricao;
A consulta continua a mesma…
Pra ter certeza que os menus sao iguais, apos a consulta verifiquei os IDs e realmente sao iguais…
Qual a query que esta sendo gerada?
Rafael
select
this_.idmenu as idmenu6_1_,
this_.imagem as imagem6_1_,
this_.nome as nome6_1_,
menuitemco2_.menu_idmenu as menu5_3_,
menuitemco2_.idmenu_item as idmenu1_3_,
menuitemco2_.idmenu_item as idmenu1_7_0_,
menuitemco2_.descricao as descricao7_0_,
menuitemco2_.imagem as imagem7_0_,
menuitemco2_.menu_idmenu as menu5_7_0_,
menuitemco2_.nome as nome7_0_
from
menu this_
left outer join
menu_item menuitemco2_
on this_.idmenu=menuitemco2_.menu_idmenu