Hibernate manyToMany annotations - cascade on relationship problem

1 resposta
R

1º problema:

INFO [LoggerStream.write():152] - Hibernate:
/* load collection br.com.ctbc.avalia.model.data.ProdutoTO.relProdCustoColl */ select
relprodcus0_.PRODUTO_ID as PRODUTO3_1_,
relprodcus0_.relProdCustoColl_CUSTO_ID as relProdC5_1_,
relprodcus0_.relProdCustoColl_PRODUTO_ID as relProdC6_1_,
relproduto1_.CUSTO_ID as CUSTO4_19_0_,
relproduto1_.PRODUTO_ID as PRODUTO3_19_0_,
relproduto1_.QUANTIDADE as QUANTIDADE19_0_,
relproduto1_.VISIVEL_BOOL as VISIVEL2_19_0_
from
SAN_REL_PRODUTO_CUSTO relprodcus0_,
SAN_REL_PRODUTO_CUSTO relproduto1_
where
relprodcus0_.relProdCustoColl_CUSTO_ID=relproduto1_.CUSTO_ID(+)
and relprodcus0_.relProdCustoColl_PRODUTO_ID=relproduto1_.PRODUTO_ID(+)
and relprodcus0_.PRODUTO_ID=?
ERROR [JDBCExceptionReporter.logExceptions():78] - ORA-00904: "RELPRODCUS0_"."RELPRODCUSTOCOLL_PRODUTO_ID": identificador inválido

ERROR [ApplicationDispatcher.invoke():686] - Servlet.service() for servlet jsp threw exception
java.sql.SQLException: ORA-00904: "RELPRODCUS0_"."RELPRODCUSTOCOLL_PRODUTO_ID": identificador inválido

De onde o hibernate está tirando esse RELPRODCUSTOCOLL_PRODUTO_ID ?
Muito estranho. o RELPRODCUSTOCOLL_ que está a mais é o atributo no TO com letras maiusculas. se remover ele fica certo :
"RELPRODCUS0_"."RELPRODCUSTOCOLL_PRODUTO_ID": identificador inválido
"RELPRODCUS0_"."PRODUTO_ID"

Meus mapeamentos:

ProdutoTO.java:
@OneToMany( targetEntity = RelProdutoCusto.class )
    @Cascade( { CascadeType.REFRESH } )
    @JoinTable( name = "SAN_REL_PRODUTO_CUSTO", joinColumns = @JoinColumn( name = "PRODUTO_ID" ) )
    public Collection<RelProdutoCusto> getRelProdCustoColl() {
        return relProdCustoColl;
    }
RelProdutoCusto.JAVA
@EmbeddedId
    @JoinColumns( value = { @JoinColumn( name = "PRODUTO_ID" ), @JoinColumn( name = "CUSTO_ID" ) } )
    public RelProdutoCustoCompositePK getRelProdutoCustoCompositePK() {
        return relProdutoCustoCompositePK;
    }
RelProdutoCustoCompositePK.java
@ManyToOne( targetEntity = ProdutoTO.class )
    @JoinColumn( name = "PRODUTO_ID", nullable = false )
    public ProdutoTO getProdutoTO() {
        return produtoTO;
    }
    
    @ManyToOne( targetEntity = CustoTO.class )
    @JoinColumn( name = "CUSTO_ID", nullable = false )
    public CustoTO getCustoTO() {
        return custoTO;
    }

1 Resposta

R

Solução para o problema acima:

http://boris.kirzner.info/blog/archives/2008/07/19/hibernate-annotations-the-many-to-many-association-with-composite-key/
Utiliza hibernate annotations , EmbeddedId , AssociationOverrides , Embeddable , AssociationOverride

Nao consegui implementar com Cascade pra relação.
Um usuário até colocou um exemplo com cascade nas respostas ( no link acima faça uma pesquisa pelo texto “the sample code DOES NOT provide this”)
Mas ocorre o erro abaixo.
Creio que é porque o hibernate não está conseguindo associar o produtoTO no *RelProdutoCusto que estaria sendo salvo pelo cascade; devido aos RelProdutoCusto’s que foram setados no produtoTO ainda não terem a co-relação com produtoTO ( [color=red]exatamente porque quero com Cascade e ele deveria fazer essa associação após obter o produtoId, correto?[/color] ). Até que no exemplo do usuário AnD, ele descreve assim: //no need to set product since we are creating a new product
*RelProdutoCusto = meu relativo de ProductItem do link

erro: <blockquote>ERROR [AbstractHibernateDAO.create():108] - Exception on createnull

ERROR [GerenciaProdutoAction.create():400] - exceção inesperada

javax.persistence.PersistenceException: Falha ao tentar inserir objeto

at br.com.ctbc.common.persistence.AbstractHibernateDAO.create(AbstractHibernateDAO.java:109)

at br.com.ctbc.avalia.business.services.impl.ProdutoService.create(ProdutoService.java:196)

at br.com.ctbc.avalia.controller.action.gerencia.GerenciaProdutoAction.create(GerenciaProdutoAction.java:375)

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:585)

at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)

at br.com.ctbc.common.controller.action.BaseAction.dispatchMethod(BaseAction.java:69)

at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)

at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)

at java.lang.Thread.run(Thread.java:595)

Caused by: java.lang.NullPointerException

at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:112)

at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:120)

at org.hibernate.type.EntityType.getHashCode(EntityType.java:279)

at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:189)

at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:104)

at org.hibernate.engine.EntityKey.<init>(EntityKey.java:48)

at org.hibernate.engine.StatefulPersistenceContext.getDatabaseSnapshot(StatefulPersistenceContext.java:240)

at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:189)

at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:512)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:80)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)

at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:218)

at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)

at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)

at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)

at org.hibernate.engine.Cascade.cascade(Cascade.java:130)

at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)

at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)

at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)

at br.com.ctbc.common.persistence.AbstractHibernateDAO.create(AbstractHibernateDAO.java:100)

 33 more

DEBUG [GerenciaProdutoAction.create():403] - create method finished

INFO  [GeneralExceptionHandler.execute():32] - [GE] General Exception 

ERROR [GeneralExceptionHandler.saveException():49] - User:null;

ERROR [GeneralExceptionHandler.saveException():50] - Path: <a href="http://localhost:8080/ctbcsan/gerenciaProduto.do?acao=create;">http://localhost:8080/ctbcsan/gerenciaProduto.do?acao=create;</a>

ERROR [GeneralExceptionHandler.saveException():51] - Exception:

java.lang.Exception: Erro inesperado no método create de Produto!

at br.com.ctbc.avalia.controller.action.gerencia.GerenciaProdutoAction.create(GerenciaProdutoAction.java:401)

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:585)

at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)

at br.com.ctbc.common.controller.action.BaseAction.dispatchMethod(BaseAction.java:69)

at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)

at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)

at java.lang.Thread.run(Thread.java:595)

Caused by: javax.persistence.PersistenceException: Falha ao tentar inserir objeto

at br.com.ctbc.common.persistence.AbstractHibernateDAO.create(AbstractHibernateDAO.java:109)

at br.com.ctbc.avalia.business.services.impl.ProdutoService.create(ProdutoService.java:196)

at br.com.ctbc.avalia.controller.action.gerencia.GerenciaProdutoAction.create(GerenciaProdutoAction.java:375)

 31 more

Caused by: java.lang.NullPointerException

at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:112)

at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:120)

at org.hibernate.type.EntityType.getHashCode(EntityType.java:279)

at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:189)

at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:104)

at org.hibernate.engine.EntityKey.<init>(EntityKey.java:48)

at org.hibernate.engine.StatefulPersistenceContext.getDatabaseSnapshot(StatefulPersistenceContext.java:240)

at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:189)

at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:512)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:80)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)

at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:218)

at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)

at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)

at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)

at org.hibernate.engine.Cascade.cascade(Cascade.java:130)

at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)

at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)

at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)

at br.com.ctbc.common.persistence.AbstractHibernateDAO.create(AbstractHibernateDAO.java:100)

 33 more</blockquote>
Criado 3 de agosto de 2009
Ultima resposta 3 de ago. de 2009
Respostas 1
Participantes 1