Pessoal, estou usando o Spring para me ajudar a trabalhar com o Hibernate, mas estou precisando criar um método para excluir o relacionamento entre duas entidades e depois remontar esse relacionamento. Na aplicação (web) eu tenho duas listas, onde uma contem os Subtemas e na outra os Subtemas que estão relacionados a um Tema. Quando eu submeto o formulário, eu envio os ids dos Subtemas. No servidor, todos os Subtemas relacionados ao Tema são removidos, os ids recebidos são iterados, faz-se uma pesquisa para cada id e vou adicionando de novo no Tema. Por fim, atualizo o Tema.
Meu problema está na hora que tento alterar algo no Tema. O primeiro erro vem quando eu tento limpar o Set que mantém os Subtemas no tema. Vejam o código:
hTemplate é um HibernateTemplate e idsSubtemasRelacionados é uma String que contém todos os ids dos Subtemas a serem relacionados, separados por traço.
[code]
if ( !idsSubtemasRelacionados.equals( “” ) ) {
o = ( Tema ) hTemplate.load( Tema.class,
Long.parseLong( request.getParameter( "id" ) ) );
// retira todos os subtemas
// o erro acontece aqui, quanto teto mudar algo do objeto recebido.
o.getSubtemas().clear();
String[] idsSubtemas = idsSubtemasRelacionados.split( "-" );
for ( String i : idsSubtemas ) {
// pesquisa cada subtema e insere no tema
o.getSubtemas().add( ( Subtema ) hTemplate.load( Subtema.class, Long.parseLong( i ) ) );
}
hTemplate.update( o );
}[/code]
Tema e Subtema estão usando um relacionamento ManyToMany, ou seja, a tabela que liga os dois é gerada pelo Hibernate e cada um está mapeado dentro do outro por um Set. O método equals está implementado tanto em Tema quanto em Subtema.
Então, no e.getSubtemas().clear() é gerada uma excessão.
could not initialize proxy - the owning Session was closed
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:140)
br.com.ynner.ynnerlib.entidades.Tema$$EnhancerByCGLIB$$a798a758.getSubtemas(<generated>)
br.com.ynner.ynnerlib.servlets.TemaServlet.processRequest(TemaServlet.java:66) << LINHA DO e.getSubtemas.clear()
br.com.ynner.ynnerlib.servlets.TemaServlet.doPost(TemaServlet.java:100)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Estou usando Servlets devido a especificação que me foi passada.
Obrigado pelas dicas, eu testei as mesmas mesmo tendo certeza que não é isso.
O problema está que o Spring não está mantendo a sessão aberta, pois se eu altero algo no objeto ele não deixa, isso está ligado a qualquer atributo e não só ao Set. Enfim, obrigado pela ajuda.
Andei pesquisando, e como o próprio erro diz, é pq a sessão do Hibernate já está fechada, e como estou usando lazy loading dá esse erro. O mais estranho é que mudei todos os relacionamentos para FetchType.EAGER e mesmo assim não funciona, o erro permanece.
Teria como configurar para que no Spring a sessão fique aberta e depois eu a feche?
[quote=davidbuzatto]Já estou quase montando a entidade fraca na mão
Ninguém tem uma solução? Eu não queria abrir mão do Spring :([/quote]
Amigo, o Spring resolve este problema. Tudo que tem que fazer é injetar a session por ele. Fazer manualmente é muito tosco e vira um baita trabalho desnecessário.
Vá ao site do Urubatan:
www.urubatan.com.br
Lá existem exemplos com Spring e o Annotation dele. Muito bom e resolve seu problema.
[quote=ajaxinaction][quote=davidbuzatto]Já estou quase montando a entidade fraca na mão
Ninguém tem uma solução? Eu não queria abrir mão do Spring :([/quote]
Amigo, o Spring resolve este problema. Tudo que tem que fazer é injetar a session por ele. Fazer manualmente é muito tosco e vira um baita trabalho desnecessário.
Vá ao site do Urubatan:
www.urubatan.com.br
Lá existem exemplos com Spring e o Annotation dele. Muito bom e resolve seu problema.
Usando o OpenSessionInViewFilter (post do Kenobi) eu tive que a partir do meu Hibernate Template obter a sessão e abrir uma transação e dar commit na mesma. Porque o transaction manager não funciona? Fui obrigado a criar, iniciar e comitar a transação.
Outra coisa que estava errada era o mapeamento que estava invertido em TODOS os meus relacionamentos :D, mas isso não tem nada haver com o “erro” do Spring.
[quote=davidbuzatto] Porque o transaction manager não funciona? Fui obrigado a criar, iniciar e comitar a transação.
[/quote]
vc configurou a transação no applicationContext?
[quote=jgbt][quote=davidbuzatto] Porque o transaction manager não funciona? Fui obrigado a criar, iniciar e comitar a transação.
[/quote]
vc configurou a transação no applicationContext?