2

This is a tough one. I know there is plenty of questions like that here, but my problem is, that I'm not allowed to change/edit the class heirarchy, because this is an already productive application, which if changed fundamentally, must be tested thoroughly and this will cost to much. Even if there's something stupid in the hierarchy, I'm not allowed to change it, because the whole application might stop functioning, and it will take long hours to bring it back on. (Nasty, I know). So, basically, what I am looking for here is some kind of workaround, that will give me a chance to delete entity instances without constraint violation and changing the hierarchy.

On top of the hieararchy is an entity "Request", that splits further in "Import Request" and "Export Request". So ImportRequest extends Request and ExportRequest extends Request. Every ExportRequest has a Set of Position, which is defined like that:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "antrag_id")
@ForeignKey(name= "FK_EXPAN_POS")
public Set<Position> getPosition() {
    try {
        position.size();
    } catch (Exception e) {
        // NO Need just make hibernate load the list
    }

    return position;
}

Position is just another Entity. And every ImportRequest has a Set of ImportPosition, like that:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "antrag_id")
@ForeignKey(name= "FK_IMPAN_POS")
public Set<ImportPosition> getImportPosition() {

    try {
        importPosition.size();
    }
    catch (Exception e)
    {
        // hallo 
    }
    return importPosition;
}

whereas ImportPosition extends Position.

Every Position has only one Probe assigned to it, which is defined like that:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "probe")
@ForeignKey(name = "FK_POS_PROB")
public Probe getProbe() {
    return probe;
}

Implicitly evert ImportPosition will have one too, because it extends the Position. Which also works on a database level.

I'm deleting an IMportRequets with a method like this:

@Transactional
public void cleanArchivedRequests() {
    List<Integer> archivedRequestList = requestDao.retrieveAllArchivedRequests();
    for (Integer antragId : archivedRequestList) {
        Request requestToDelete = requestDao.loadById(requestId);
        requestDao.delete(requestToDelete);

        StringBuffer protocolEntry = new StringBuffer("Request mit der ID: ");
        protocolEntry.append(requestId);
        protocolEntry.append(" gelöscht!");
        protocol(protocolEntry.toString());
    }
}

Apparently Hibernate has problems deleting the Probe which is referenced by an ImportPosition in an ImportRequet, because I get this:

 [java] java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))

requestDao is injected via Spring with applicationContext-daos.xml in my class, where the method "cleanArchivedRequests" is.

So my question is, given that hierarchy, is it possible at all to successfully delete the Probe instances from the ImportPosition and if so, how would that work. I've already tried to delete the Probe instances first and than the ImportRequest, but that didn't work, supposedly because the whole thing happens in one transaction. Or at least this is my explanation.

PS. The whole Stacktrace goes like this:

 [java] java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] 2012-06-22 17:56:07,925 [DEBUG] - com.mchange.v2.sql.SqlUtils.toSQLException:85 - Attempted to convert SQLException to SQLException. Leaving it alone. [SQLState: 23000; errorCode: 1451]
 [java] java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] 2012-06-22 17:56:07,925 [DEBUG] - com.mchange.v2.c3p0.impl.DefaultConnectionTester.statusOnException:126 - Testing a Connection in response to an Exception:
 [java] java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] 22.06.2012 17:56:07 org.hibernate.util.JDBCExceptionReporter logExceptions
 [java] WARNUNG: SQL Error: 1451, SQLState: 23000
 [java] 22.06.2012 17:56:07 org.hibernate.util.JDBCExceptionReporter logExceptions
 [java] SCHWERWIEGEND: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java] 22.06.2012 17:56:07 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
 [java] SCHWERWIEGEND: Could not synchronize database state with session
 [java] org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 [java]     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
 [java]     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     ... 23 more
 [java] 2012-06-22 17:56:07,941 [DEBUG] - org.springframework.orm.hibernate3.HibernateTransactionManager.doRollbackOnCommitException:871 - Initiating transaction rollback after commit exception
 [java] org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 [java]     at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:636)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:789)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:663)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 [java]     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
 [java]     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     ... 8 more
 [java] Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     ... 23 more
 [java] 2012-06-22 17:56:07,941 [DEBUG] - org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback:670 - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@1c10834]
 [java] 2012-06-22 17:56:07,956 [DEBUG] - org.springframework.orm.hibernate3.HibernateTransactionManager.doCleanupAfterCompletion:730 - Closing Hibernate Session [org.hibernate.impl.SessionImpl@1c10834] after transaction
 [java] 2012-06-22 17:56:07,956 [DEBUG] - org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession:789 - Closing Hibernate Session
 [java] 2012-06-22 17:56:07,956 [DEBUG] - com.mchange.v2.resourcepool.BasicResourcePool.trace:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1a37fac [managed: 10, unused: 9, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@f1b25e)
 [java] Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 [java]     at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:636)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:789)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:663)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
 [java]     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
 [java]     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
 [java]     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
 [java]     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 [java]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 [java]     at $Proxy33.cleanArchivedRequests(Unknown Source)
 [java]     at de.fast.hama.util.HamaRequestArchiver.main(HamaRequestArchiver.java:66)
 [java] Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 [java]     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
 [java]     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
 [java]     at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2507)
 [java]     at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
 [java]     at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
 [java]     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
 [java]     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
 [java]     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
 [java]     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
 [java]     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
 [java]     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
 [java]     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
 [java]     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
 [java]     ... 8 more
 [java] Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`position`, CONSTRAINT `FK_POS_PROB` FOREIGN KEY (`probe`) REFERENCES `probe` (`id`))
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
 [java]     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
 [java]     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
 [java]     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
 [java]     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
 [java]     ... 23 more
 [java] Java Result: 1
4

1 回答 1

0

这里的问题似乎不是 Hibernate 继承......您正在尝试从 Probe 表中删除通过 Position 表(及其类层次结构)中的外键引用的行。

我假设您使用的是@ForeignKey使用从 Hibernate 对象生成的脚本来生成数据库 DDL 脚本的注释。默认情况下,这些约束不指定引用删除的任何行为,因此您会看到错误。您可以修改约束以指定 @OnDelete 行为,或者为您删除的每个 Probe 对象显式设置外键引用为 null。

于 2012-08-30T20:06:15.737 回答