java - jpa part of composite primary key also part of composite foreign key -
i'm having problems mapping thwo relations between 3 of jpa entities. first of all, show database tables involved:
ciclista
idciclista (pk)
(rest of fields...)prueba
idprueba (pk)
(rest of fields...)inscripcion
idciclista (pk, fk in ciclista.idciclista)
idprueba (pk, fk in prueba.idprueba, fk in variante.idprueba)
idvariante (fk in variante.idvariante)
(rest of fields...)variante
idprueba (pk, fk in prueba.idprueba)
idvariante (pk)
(rest of fields...)
the problem highlighted field, part of composite pk of inscripcion, fk in prueba , part of composite fk in variante, @ same time.
my jpa entity:
@entity @table(name = "inscripcion") @idclass(value=inscripcionpk.class) public class inscripcion { // attributes @column private int dorsal; @column @temporal(temporaltype.timestamp) private date fechahora; @column private int estado; // relationships @id @manytoone @joincolumn(name = "idciclista") private ciclista participante; @id @manytoone @joincolumn(name = "idprueba", insertable=false, updatable=false) private prueba prueba; @manytoone @joincolumns({ @joincolumn(name="idprueba"), @joincolumn(name="idvariante") }) private variante variante; //constructors, public getters , setters... } @embeddable public class inscripcionpk implements serializable { private static final long serialversionuid = -582735882125091352l; int participante; int prueba; //public getters , setters, hashcode, equals... } i don't paste rest of mappings because didn't caused me problem far, have references current entity (bidirectional mappings).
i following exception when persisting "inscripcion" object:
... caused by: javax.persistence.persistenceexception: org.hibernate.exception.genericjdbcexception: parameter index out of range (7 > number of parameters, 6). @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1377) @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1300) @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1306) @ org.hibernate.ejb.abstractentitymanagerimpl$callbackexceptionmapperimpl.mapmanagedflushfailure(abstractentitymanagerimpl.java:1500) @ org.hibernate.engine.transaction.synchronization.internal.synchronizationcallbackcoordinatorimpl.beforecompletion(synchronizationcallbackcoordinatorimpl.java:109) @ org.hibernate.engine.transaction.synchronization.internal.registeredsynchronization.beforecompletion(registeredsynchronization.java:53) @ com.sun.enterprise.transaction.javaeetransactionimpl.commit(javaeetransactionimpl.java:435) ... 90 more caused by: org.hibernate.exception.genericjdbcexception: parameter index out of range (7 > number of parameters, 6). @ org.hibernate.exception.internal.standardsqlexceptionconverter.convert(standardsqlexceptionconverter.java:54) @ org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:125) @ org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:110) @ org.hibernate.engine.jdbc.internal.proxy.abstractstatementproxyhandler.continueinvocation(abstractstatementproxyhandler.java:129) @ org.hibernate.engine.jdbc.internal.proxy.abstractproxyhandler.invoke(abstractproxyhandler.java:81) @ sun.proxy.$proxy211.setint(unknown source) @ org.hibernate.type.descriptor.sql.integertypedescriptor$1.dobind(integertypedescriptor.java:57) @ org.hibernate.type.descriptor.sql.basicbinder.bind(basicbinder.java:92) @ org.hibernate.type.abstractstandardbasictype.nullsafeset(abstractstandardbasictype.java:280) @ org.hibernate.type.abstractstandardbasictype.nullsafeset(abstractstandardbasictype.java:275) @ org.hibernate.type.componenttype.nullsafeset(componenttype.java:358) @ org.hibernate.persister.entity.abstractentitypersister.dehydrateid(abstractentitypersister.java:2784) @ org.hibernate.persister.entity.abstractentitypersister.dehydrate(abstractentitypersister.java:2753) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:3025) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:3469) @ org.hibernate.action.internal.entityinsertaction.execute(entityinsertaction.java:88) @ org.hibernate.engine.spi.actionqueue.execute(actionqueue.java:362) @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:354) @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:275) @ org.hibernate.event.internal.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:326) @ org.hibernate.event.internal.defaultflusheventlistener.onflush(defaultflusheventlistener.java:52) @ org.hibernate.internal.sessionimpl.flush(sessionimpl.java:1213) @ org.hibernate.internal.sessionimpl.managedflush(sessionimpl.java:402) @ org.hibernate.engine.transaction.synchronization.internal.synchronizationcallbackcoordinatorimpl.beforecompletion(synchronizationcallbackcoordinatorimpl.java:104) ... 92 more caused by: java.sql.sqlexception: parameter index out of range (7 > number of parameters, 6). @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:1074) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:988) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:974) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:919) @ com.mysql.jdbc.preparedstatement.checkbounds(preparedstatement.java:3813) @ com.mysql.jdbc.preparedstatement.setinternal(preparedstatement.java:3795) @ com.mysql.jdbc.preparedstatement.setinternal(preparedstatement.java:3840) @ com.mysql.jdbc.preparedstatement.setint(preparedstatement.java:3784) @ com.mysql.jdbc.jdbc2.optional.preparedstatementwrapper.setint(preparedstatementwrapper.java:399) @ com.sun.gjc.spi.base.preparedstatementwrapper.setint(preparedstatementwrapper.java:190) @ sun.reflect.generatedmethodaccessor82.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:616) @ org.hibernate.engine.jdbc.internal.proxy.abstractstatementproxyhandler.continueinvocation(abstractstatementproxyhandler.java:122) if put "insertable = false, updatable = false" in @joincolum's @ "variante", following exception:
... caused by: javax.persistence.persistenceexception: org.hibernate.exception.constraintviolationexception: cannot add or update child row: foreign key constraint fails (`projectbike`.`inscripcion`, constraint `fk_inscripcion_variante1` foreign key (`idvariante`, `idprueba`) references `variante` (`idvariante`, `idprueba`) on delete no action on update no acti) @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1377) @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1300) @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1306) @ org.hibernate.ejb.abstractentitymanagerimpl$callbackexceptionmapperimpl.mapmanagedflushfailure(abstractentitymanagerimpl.java:1500) @ org.hibernate.engine.transaction.synchronization.internal.synchronizationcallbackcoordinatorimpl.beforecompletion(synchronizationcallbackcoordinatorimpl.java:109) @ org.hibernate.engine.transaction.synchronization.internal.registeredsynchronization.beforecompletion(registeredsynchronization.java:53) @ com.sun.enterprise.transaction.javaeetransactionimpl.commit(javaeetransactionimpl.java:435) ... 90 more caused by: org.hibernate.exception.constraintviolationexception: cannot add or update child row: foreign key constraint fails (`projectbike`.`inscripcion`, constraint `fk_inscripcion_variante1` foreign key (`idvariante`, `idprueba`) references `variante` (`idvariante`, `idprueba`) on delete no action on update no acti) @ org.hibernate.exception.internal.sqlexceptiontypedelegate.convert(sqlexceptiontypedelegate.java:74) @ org.hibernate.exception.internal.standardsqlexceptionconverter.convert(standardsqlexceptionconverter.java:49) @ org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:125) @ org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:110) @ org.hibernate.engine.jdbc.internal.proxy.abstractstatementproxyhandler.continueinvocation(abstractstatementproxyhandler.java:129) @ org.hibernate.engine.jdbc.internal.proxy.abstractproxyhandler.invoke(abstractproxyhandler.java:81) @ sun.proxy.$proxy233.executeupdate(unknown source) @ org.hibernate.engine.jdbc.batch.internal.nonbatchingbatch.addtobatch(nonbatchingbatch.java:56) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:3028) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:3469) @ org.hibernate.action.internal.entityinsertaction.execute(entityinsertaction.java:88) @ org.hibernate.engine.spi.actionqueue.execute(actionqueue.java:362) @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:354) @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:275) @ org.hibernate.event.internal.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:326) @ org.hibernate.event.internal.defaultflusheventlistener.onflush(defaultflusheventlistener.java:52) @ org.hibernate.internal.sessionimpl.flush(sessionimpl.java:1213) @ org.hibernate.internal.sessionimpl.managedflush(sessionimpl.java:402) @ org.hibernate.engine.transaction.synchronization.internal.synchronizationcallbackcoordinatorimpl.beforecompletion(synchronizationcallbackcoordinatorimpl.java:104) ... 92 more caused by: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintviolationexception: cannot add or update child row: foreign key constraint fails (`projectbike`.`inscripcion`, constraint `fk_inscripcion_variante1` foreign key (`idvariante`, `idprueba`) references `variante` (`idvariante`, `idprueba`) on delete no action on update no acti) @ sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) @ sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:57) @ sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl.java:45) @ java.lang.reflect.constructor.newinstance(constructor.java:532) @ com.mysql.jdbc.util.handlenewinstance(util.java:411) @ com.mysql.jdbc.util.getinstance(util.java:386) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:1040) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:4096) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:4028) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:2490) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2651) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2734) @ com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:2155) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2458) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2375) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2359) @ com.mysql.jdbc.jdbc2.optional.preparedstatementwrapper.executeupdate(preparedstatementwrapper.java:875) @ com.sun.gjc.spi.base.preparedstatementwrapper.executeupdate(preparedstatementwrapper.java:125) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:616) @ org.hibernate.engine.jdbc.internal.proxy.abstractstatementproxyhandler.continueinvocation(abstractstatementproxyhandler.java:122) ... 106 more i dont know if hibernate bug, if case not suported jpa or if i'm missing obvious.
edit:
i post variante class, becaus has composite key too. hope helps:
@entity @table(name="variante") @idclass(value=variantepk.class) public class variante { //atributos @id @column(name="idvariante") private short id; @column private string nombre; @column private integer longitud; @column private integer desnivelpos; @column private boolean mostrartrack; //relaciones @id @manytoone(optional = false, cascade=cascadetype.all) @joincolumn(name="idprueba") private prueba prueba; @manytoone(cascade = cascadetype.all) @joincolumn(name="idrecorrido") private recorrido recorrido; @onetomany(mappedby = "variante", cascade = cascadetype.all, fetch=fetchtype.eager) private set<inscripcion> inscripciones; // consructors, getters , setters... } public class variantepk implements serializable { private static final long serialversionuid = -3276237020478540672l; private short id; private integer prueba; public variantepk() { super(); } //constructors, getters, setters, hashcode, equals... }
Comments
Post a Comment