Oi pessoal, estou tendo problemas em fazer o mapeamento de classes no hibernate. Tenho uma classe boleto e uma classe pedidos. Meu mapeamento está da seguinte forma:
PEDIDO
@Entity(name = "pedido")
public class Pedido implements Serializable{
private static final long serialVersionUID = 5925760158985403826L;
@Transient
@OneToMany(targetEntity=Boleto.class, mappedBy="pedido", orphanRemoval=true, fetch = FetchType.LAZY)
private List<Boleto> boleto;
}
BOLETO
@Entity(name = "boleto")
public class Boleto implements Serializable{
private static final long serialVersionUID = 109317415544780134L;
@ManyToOne(optional=true)
@JoinColumn(name="id_pedido")
private Pedido pedido;
}
Quando faço uma busca por botelo, pedido vem preenchido corretamente mas quando faço uma busca por pedido o objeto boleto está vindo null. Alguém sabe dizer o que estou fazendo de errado?
Obrigado desde já
Tente remover a anotação @Transient do boleto na classe Pedido.
Esta anotação serve pra dizer que a informção não deve inserida pelo banco de dados e que é gerada perada pela aplicação e não pelo banco.
Oi Sergio, obrigado pela resposta. Quando retiro a anotação transient, boleto vem com o valor PersistentBag e mensagem de erro: com.sun.jdi.InvocationException occurred invoking method.
Pelo que andei pesquisando, quando uma classe implementa Serializable o relacionamento OneToMany deve ser anotado como transient, caso contrário o valor retornado vem como PersistentBag.
Abraço
[quote=depinho]Pelo que andei pesquisando, quando uma classe implementa Serializable o relacionamento OneToMany deve ser anotado como transient, caso contrário o valor retornado vem como PersistentBag.[/quote]Onde você viu isso?
Herbert, agora não posso te dizer exatamente onde pois estou pesquisando sobre este problema há dois dias e o que já vi de site não tá no gibi…
Foi em um dois sites que entrei… O fato é que quando não assino como transient o valor retorna como pesistentbag e quando coloco o transient o valor retorna null. Infelizmente na internet encontramos muita informação deturpada e que pode induzir ao erro, e no meu caso que estou iniciando com o hibernate isso atrapalha bastante.
De qualquer maneira o problema persiste, você tem alguma idéia do que possa ser ?
Abraço
Você está dizendo que é Lazy, desta forma não vai trazer mesmo, mude para EAGER.
[quote=depinho]Herbert, agora não posso te dizer exatamente onde pois estou pesquisando sobre este problema há dois dias e o que já vi de site não tá no gibi…
Foi em um dois sites que entrei… O fato é que quando não assino como transient o valor retorna como pesistentbag e quando coloco o transient o valor retorna null. Infelizmente na internet encontramos muita informação deturpada e que pode induzir ao erro, e no meu caso que estou iniciando com o hibernate isso atrapalha bastante.
De qualquer maneira o problema persiste, você tem alguma idéia do que possa ser ?
Abraço[/quote]E qual o problema de ser um pesistence bag?
Você viu na documentação que ele implementa List?
http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/collection/PersistentBag.html
Kleber, obrigado pela ajuda. Mudei conforme sua orientação mas continua não funcionando, vou continuar tentando e caso encontre o problema volto aqui para postar o resultado. Se me permite gostaria de perguntar o seguinte: a minha tabela pedido não tem “fisicamente” um campo boleto. O campo id_pedido está apenas na tabela boleto, ou seja, o campo id_pedido é uma chave estrangeira na tabela boleto. O que eu preciso é listar todos os boletos que um pedido tem e por isso essa minha tentativa de mapeamento. Este problema está acontecendo porque estou mapeando um campo na entidade pedido (no caso uma lista de boletos) que não existe na tabela pedidos ?
Herbert, se eu soubesse qual o problema não estaria perguntando. Pelas respostas que você deu até agora me parece que você está de má vontade, posso estar enganado visto que as palavras não transmitem a entonação que queremos dar, mas pela minha leitura você está sendo bastante ignorante. Se for este o caso, o que posso dizer é que os fóruns são locais para troca de idéias e conhecimento, e eles nos dão a liberdade de não respondermos a um tópico caso este nos pareça “idiota”… Sou iniciante e mesmo se não fosse não sei tudo, não vi problema algum em colocar aqui a minha dúvida, me desculpe se te incomodei.
Abraços
Não tem auto relacionamento nesse caso (OneToMany/ManyToOne)
Qd vc busca por boleto o pedido vem preenchido pq o boleto sabe qual é o pedido: @JoinColumn(name=“id_pedido”)
Qd vc busca por pedido ele não tem referencia pro boleto. Vc precisa pegar o id do pedido e buscar os boletos com aquele id_pedido.
Não precisa usar o @Transient
[quote=depinho]Kleber, obrigado pela ajuda. Mudei conforme sua orientação mas continua não funcionando, vou continuar tentando e caso encontre o problema volto aqui para postar o resultado. Se me permite gostaria de perguntar o seguinte: a minha tabela pedido não tem “fisicamente” um campo boleto. O campo id_pedido está apenas na tabela boleto, ou seja, o campo id_pedido é uma chave estrangeira na tabela boleto. O que eu preciso é listar todos os boletos que um pedido tem e por isso essa minha tentativa de mapeamento. Este problema está acontecendo porque estou mapeando um campo na entidade pedido (no caso uma lista de boletos) que não existe na tabela pedidos ?
Herbert, se eu soubesse qual o problema não estaria perguntando. Pelas respostas que você deu até agora me parece que você está de má vontade, posso estar enganado visto que as palavras não transmitem a entonação que queremos dar, mas pela minha leitura você está sendo bastante ignorante. Se for este o caso, o que posso dizer é que os fóruns são locais para troca de idéias e conhecimento, e eles nos dão a liberdade de não respondermos a um tópico caso este nos pareça “idiota”… Sou iniciante e mesmo se não fosse não sei tudo, não vi problema algum em colocar aqui a minha dúvida, me desculpe se te incomodei.
Abraços[/quote]É uma pena que você tenha entendido desse modo.
Bem, boa sorte aí.
Oi Diaz, obrigado. Entendi o que você explicou, fiz o seguinte: retirei o mapeamento e criei um método no MB onde faço a busca dos boletos que um pedido tem. Está funcionando assim, monto um grid com todos os pedidos e quando seleciono um pedido abro uma tela com os detalhes do mesmo. Nesse momento chamo o método para buscar os boletos do pedido. Quando executo pela primeira vez funciona perfeitamente. Mas ao buscar um segundo pedido, em seguida, estou recebendo o seguinte erro:
07/04/2013 09:14:19 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: /app/admin-pedido-lista.xhtml @70,145 listener="#{pedidoBean.listarItensPedido}": org.hibernate.SessionException: Session is closed!
javax.el.ELException: /app/admin-pedido-lista.xhtml @70,145 listener="#{pedidoBean.listarItensPedido}": org.hibernate.SessionException: Session is closed!
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:44)
at org.primefaces.event.SelectEvent.processListener(SelectEvent.java:40)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:102)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:760)
at javax.faces.component.UIData.broadcast(UIData.java:1071)
at javax.faces.component.UIData.broadcast(UIData.java:1093)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
Caused by: org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.createCriteria(SessionImpl.java:1655)
at eventos.dao.BoletoDAO.listarBoletoPorPedido(BoletoDAO.java:56)
at eventos.delegate.BoletoDelegate.listarBoletoPorPedido(BoletoDelegate.java:24)
at eventos.bean.PedidoBean.listarItensPedido(PedidoBean.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
... 55 more
Obrigado a todos os amigos que já contribuiram com o tópico.
Abraço
Se você tirar a anotação @trasiente, colocar fetch como eager, vai funcionar. Eu utilizo assim todos os dias e funciona perfeitamente.
@depinho
Pelo que diz o erro, a sessão está fechada.
Provavelmente vc fecha a sessão qd faz a primeira busca e qd vai iniciar outra busca não está abrindo uma nova.
Diaz, era isso mesmo… Achei o local com o problema e agora está tudo ok. Muito obrigado pela ajuda e pelo interesse, valeu mesmo 
Kleber, obrigado pela ajuda também.
Abraço