-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Delete breaks referential integrity
PostPosted: Wed Mar 11, 2015 9:21 am 
Newbie

Joined: Wed Mar 11, 2015 9:14 am
Posts: 1
Hi,

I am trying to map an entity to H2 (server mode) through JPA, with Hibernate implementation (4.3.8). The entity is a simple node in binary tree, with child nodes set to cascade all operations. When I call entityManager.remove(node); the cascaded entries are correctly set for removal (I can see them in actionQueue); however when I commit the transaction or call entityManager.flush(), the delete for entry hits 'Referential integrity constraint violation: "FK_UJOY3QEQHYBY34YBBXVHD13E: PUBLIC.NODE FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.NODE(ID) (35399)"' (full stack trace below).

This looks like quite a simple usecase, but I miss to understand what am I doing wrong. The hibernate.flushMode is set to COMMIT in persistence.xml.

Thanks for your clues.

This is the entity:

Code:
@Entity
public class Node {
    @Id
    @GeneratedValue
    long id;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    Node parent;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    Node left;

    int leftSize;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    Node right;

    int rightSize;
   
    /* constructor, getters & setters */
}


Stack trace:
Code:
javax.persistence.RollbackException: Error while committing the transaction
   at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
   at org.jboss.perf.hibernate.BenchmarkBase$BenchmarkState.commitTransaction(BenchmarkBase.java:218)
   at org.jboss.perf.hibernate.BenchmarkBase.testDelete(BenchmarkBase.java:493)
   at org.jboss.perf.hibernate.NodeBenchmark.testDelete(NodeBenchmark.java:110)
   at org.jboss.perf.hibernate.generated.NodeBenchmark_testDelete.testDelete_thrpt_jmhStub(NodeBenchmark_testDelete.java:139)
   at org.jboss.perf.hibernate.generated.NodeBenchmark_testDelete.testDelete_Throughput(NodeBenchmark_testDelete.java:85)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:189)
   at org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:171)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
   at java.util.concurrent.FutureTask.run(FutureTask.java:166)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
   at java.lang.Thread.run(Thread.java:724)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
   at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:82)
   ... 16 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
   at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129)
   at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
   at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
   at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
   at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
   at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
   at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400)
   at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630)
   at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114)
   at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
   at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
   at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
   at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
   at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
   at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
   at org.hibernate.engine.transaction.internal.jta.JtaTransaction.beforeTransactionCommit(JtaTransaction.java:129)
   at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
   at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
   ... 16 more
Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_UJOY3QEQHYBY34YBBXVHD13E: PUBLIC.NODE FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.NODE(ID) (29460)"; SQL statement:
delete from Node where id=? [23503-185]
   at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
   at org.h2.message.DbException.get(DbException.java:179)
   at org.h2.message.DbException.get(DbException.java:155)
   at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:426)
   at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:443)
   at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:318)
   at org.h2.table.Table.fireConstraints(Table.java:920)
   at org.h2.table.Table.fireAfterRow(Table.java:938)
   at org.h2.command.dml.Delete.update(Delete.java:100)
   at org.h2.command.CommandContainer.update(CommandContainer.java:78)
   at org.h2.command.Command.executeUpdate(Command.java:254)
   at org.h2.server.TcpServerThread.process(TcpServerThread.java:345)
   at org.h2.server.TcpServerThread.run(TcpServerThread.java:159)
   at java.lang.Thread.run(Thread.java:724)

   at org.h2.engine.SessionRemote.done(SessionRemote.java:622)
   at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:191)
   at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157)
   at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:143)
   at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
   ... 29 more


Crosspost in H2 GoogleGroup: https://groups.google.com/forum/#!topic/h2-database/S-DkGyTPx1Q


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.