Hibernate, JPA - Problemas com relacionamento ManyToMany

velho vc colocou o seu converter na página xhtml?

<f:converter converterId=“userConverter”/>

o que está escrito no atributo converterId acima no caso userConverter vc deve definir na annotation, @FacesConverter(value=“userConverter”)

senão colocou ele deveria ficar tag SelectManyCheckbox abaixo da tag <f:selectItems>

Vou ir pra casa agora e vou ver se precisa colocar esse converter no web.xml também.

Pensei que não precisaria, visto qua já adicionei o converter no faces-config.xml
No entanto, já tinha tentado colocar no formulário como você disse e dá uma exception:

Editado:
Calma aí, deu essa exception porque eu tinha colocado de volta aquele itemValue="#{permissao.id}"

Tirei ele e agora não deixa salvar devido algum erro de validação, vou dar mais uma checada e retorno aqui.

[quote=kinks]Pensei que não precisaria, visto qua já adicionei o converter no faces-config.xml
No entanto, já tinha tentado colocar no formulário como você disse e dá uma exception:

Estamos ficando sem opções. :frowning:
[/quote]

AAAA vc já tinha configurado lá então acontece o seguinte velho, o seu itemValue era um id lembra que pedi pra vc tirar do formulário algo como: itemValue="#{permissao.id}" então esse id é um inteiro e ele está indo para um argumento do método convert que aceita Strings, esse é o erro tente mudar o parametro do método converter para receber o value como, Integer value.

Mesmo assim vc tem que colocar <f:converter> para saber qual converter está sendo utilizado naquela situação.

Tá loco, um erro atrás do outro. :shock:

Agora quando vou incluir um novo Perfil o formulário retorna o seguinte: "j_idt10:j_idt16: Erro de validação: o valor não é válido."
Se eu apenas dar um nome ao Perfil sem escolher permissões, ele salva.
E então pensei que poderia ser o charset do banco, visto que as palavras com ascento estavam “bagunçadas”.
Aí mudei o charset do banco para latin1 - pois é o que está definido em minhas páginas.
Agora os ascentos estão aparecendo corretamente, mas o erro de validação persiste.
O mais estranho é que a mensagem fala de dois componentes “j_idt10” e “j_idt16”. Inspecionei com o Firefox e existe apenas o “j_idt10” - que é o meu form. Já esse “j_idt16” não existe (componente fantasma rsrs). :shock:

E outra, quando vou alterar um perfil dá o seguinte erro no log:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy - no Session

Cansei… :x

A annotation lazy não é necessaria é visto que o carregamento de dados do banco não é muito significativo, retire e vamos ver se fica só o outro erro.

Velho vamos descomplicar se o problema está ai, pega e da uma permissão de usuario normal para cada usuário novo cadastrado e então depois se ele precisar de uma permissão de administrador ou de desenvolverdor vc da com um usuario administrador que vc pode dar permissão de administrador pelo banco para o 1º usário.

Sem a annotation dá o mesmo erro:

failed to lazily initialize a collection of role: entityBean.Perfil.permissoes, could not initialize proxy - no Session

Então cara, se pudesse já teria deixado isso de lado, além disso, no projeto existem diversos outros casos semelhantes a este. Se isso não funfar meu projeto fica parado. =/

Sei la velho é seu tcc não é? Não tem ninguém pra te auxilia na persistencia, eu nem minha faculdade não começei ainda só vai começar ano que vem =| , entra nesse blog www.uaihebert.com.br e lê o mini livro dele sobre JPA é mt bom.

Ter até tem uns caras, mas ficam com preguiça de ajudar, aí também não fico correndo atrás e tento me virar sozinho.
Vou continuar pesquisando e ler esse mini livro.

Cara, brigadão pela ajuda, mesmo!

Finalmente, foi resolvido grande parte dos problemas! :smiley:
Vamos lá!

O problema de “Erro de validação: o valor não é válido” era apenas meus métodos sobrescritos, hashCode() e equals() que estavam errados. Peguei outro modelo e pronto.
(Fonte: http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/)

Depois disso, ele ainda não gravava por causa da annotation “errada”, ou melhor, invertida:
Errado:

    joinColumns = { @JoinColumn(name = "ID_PERMISSAO")},    
    inverseJoinColumns={@JoinColumn(name="ID_PERFIL")})

Correto:

    joinColumns = { @JoinColumn(name = "ID_PERFIL")},    
    inverseJoinColumns={@JoinColumn(name="ID_PERMISSAO")})

Depois dessas alterações a inclusão de Perfil está funcionando corretamente.
Agora tenho apenas um erro quando vou alterar um Perfil:

Ainda sim já senti um alívio. :slight_smile:

Ah, só pra informar, para gerar os IDs automaticamente não é necessário inserir o inputHidden no formulário. <h:inputHidden value="#{UsuarioBean.usuario.codigo}"/>

Alguém aí que já tenha passado por isso? (LazyInitializationException)

Parece ter algo haver com o Spring. :?

me mostra seus relacionamentos, tem algum relacionamento que busca uma lista e não é qualquercoisaToOne?

@LazyCollection(LazyCollectionOption.FALSE) retira isso da sua classe e perfil, essa exceção ocorre quando vc faz o que? Se for quando vc faz alguma pesquisa, poste suas classes DAO.

Por enquanto, o único relacionamento que tenho mesmo é esse ManyToMany, entre Perfil e Permissão.

O erro ocorre quando vou alterar um Perfil.
Tipo assim:
Na página tenho uma lista de Perfis, seleciono um para alterar, aparece a página de alteração, modifico algo, e quando clico em salvar acontece a exception.

Sem a annotation (@LazyCollection(LazyCollectionOption.FALSE)) fica pior, a exception acontece antes de exibir a página de alteração.

Com a annotation a exception é assim:

Sem a annotation a exception é assim:

Se precisar, minha classe de Persistência de Perfil está na primeiro post, o nome da classe é: PerfilHIB.

Então velho no seu relacionamento ManyToMany faça o seguinte @ManyToMany(fetch=FetchType.EAGER) isso deve mudar a forma com que ele pega os dados do banco.

Já tentei isso e dá a mesma exception. =/

http://blog.caelum.com.br/enfrentando-a-lazyinitializationexception-no-hibernate/ vai lendo esse ai enquanto vejo outra possibilidade, esse post é muito parecido com seu problema.

Tive este mesmo problema.
no meu caso estava utilizando um <h:selectManyMenu com o value apontando para uma lista na qual eu queria inserir os itens selecionados
o que acontece e que na hora do jsf inserir os itens selecionados na lista ele não os converte como a lista é generia nada da errado ate o hibernate
tentar recuperala, neste momento em vez de recuperar uma List ele recupera uma List , sendo assim o objeto String não possui as
propriedades da suaclasse e a exception e lançada com a descrição dos atributos que não puderam ser encontrados em rumtime por reflexão ou metodos
getter e setter.

para resolver o problema vc deve recuperar os itens da List onde cada elemento corresponde ao valor retornado pelo metodo suaclasse.toString()
fazer uma parser para o tipo da sua ID e recuperar os dados no banco de dados.

qualquer duvida em relação a explicação poste junto a sua pergunta o codigo jsf responsavel por inserir os itens na List.