[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - Composite keys that includes a relationship

elgabo do-not-reply at jboss.com
Tue Oct 14 21:18:07 EDT 2008


Hi everyone,

I'm stuck with a legacy database with tables that use foreign keys also as part of a composite primary key, eg



  | TABLE A
  |    a_id (PK)
  | 
  | TABLE B
  |    a_id (PK, FK)
  |    b_id (PK, FK)
  | 

"Pro EJB3 Java Persistence API" tips me how to handle this kind of structure.



  | @Entity
  | @IdClass(BId.class)
  | public class B {
  |    @Id
  |    @Column(name="a_id", insertable=false, updatable=false)
  |    private int aId
  |    @Id
  |    private int bId
  |    @ManyToOne
  |    @JoinColumn(name="a_id")
  |    private B b;
  |    //getters and setters
  | }
  | 
  | public class BId {
  |   private int aId;
  |   private int bId;
  |   public BId(int aId, int bId){...}
  |   //getters
  | }
  | 

when I try to persist a B instance seems that jboss tries to create create a statement with 3 parameters when it only needs to use 2 (a_id, b_id)

In my specific case class "B" is "Recurso", it only has 8 columns, but hibernate tries to bind '130' to index '9'


  | 20:11:16,241 INFO  [STDOUT] Hibernate: insert into dbo.Recurso (ayuda, ubicacion, Orden_recurso, inicial, descripcion, Tipo_recurso, Codigo_aplicacion, codigo) values (?, ?, ?, ?, ?, ?, ?, ?)
  | 20:11:23,538 INFO  [IntegerType] could not bind value '130' to parameter: 9; Invalid parameter index 9.
  | 20:11:23,538 INFO  [IntegerType] could not bind value '130' to parameter: 9; Invalid parameter index 9.
  | 20:11:23,538 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 07009
  | 20:11:23,538 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 07009
  | 20:11:23,538 ERROR [JDBCExceptionReporter] Invalid parameter index 9.
  | 20:11:23,538 ERROR [JDBCExceptionReporter] Invalid parameter index 9.
  | 20:11:23,538 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
  | org.hibernate.exception.SQLGrammarException: could not insert: [seguridad.entities.Recurso]
  | 	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
  | 	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
  | 	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
  | 	at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
  | 	at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:114)
  | 	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:247)
  | 	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:86)
  | 	at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
  | 	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1389)
  | 	at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
  | 	at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
  | 	at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
  | 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
  | 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
  | 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
  | 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | 	at org.jboss.wsf.container.jboss42.InvocationHandlerEJB3.invoke(InvocationHandlerEJB3.java:103)
  | 	at org.jboss.ws.core.server.ServiceEndpointInvoker.invoke(ServiceEndpointInvoker.java:220)
  | 	at org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:408)
  | 	at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:272)
  | 	at org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:189)
  | 	at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:122)
  | 	at org.jboss.wsf.stack.jbws.EndpointServlet.service(EndpointServlet.java:84)
  | 	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(Unknown Source)
  | Caused by: java.sql.SQLException: Invalid parameter index 9.
  | 	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.getParameter(JtdsPreparedStatement.java:341)
  | 	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setParameter(JtdsPreparedStatement.java:410)
  | 	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setInt(JtdsPreparedStatement.java:579)
  | 	at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setInt(WrappedPreparedStatement.java:117)
  | 	at org.hibernate.type.IntegerType.set(IntegerType.java:41)
  | 	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
  | 	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116)
  | 	at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:284)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2008)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2243)
  | 	... 58 more
  | 

how can I avoid this problem? ... thanks for your help

PS: Im using jboss as 4.2.2 with java 5.0

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4182262#4182262

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4182262



More information about the jboss-user mailing list