私は2つのエンティティを持っています。Post->Threadからの OnetoOne マッピングを使用したThreadエンティティとPostエンティティ。
Threadエンティティには多数の投稿が含まれます。OnetoOne の代わりに OnetoMany を使用する必要があったことはわかっていますが、すべてのコレクションの問題を回避するために OnetoOne を使用しています
問題は、スレッドを削除すると、それに関連付けられているすべての投稿も削除する必要があることです。を使用して成功しています
@OnDelete(action = OnDeleteAction.CASCADE)
ただし、Postgres と Ms-SQl でのみ機能し、MySql では機能しません (InnoDb も試しました)。スキーマ生成クエリでは、on delete カスケードは生成されません。
以下はコードです
//Thread Entity
@Id
@GeneratedValue
@Column(name = "thread_id")
private int ThreadID;
//Post Entity
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "post_id")
private int PostID;
@OneToOne()
@OnDelete(action = OnDeleteAction.CASCADE)
private thread ThreadID;
次のクエリを使用してThreadエンティティからアイテムを削除しているときに、次のエラーが発生します
session.delete(session.load(thread.class,1));
2014 年 9 月 2 日 8:33:51 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 警告: SQL エラー: 1451、SQLState: 23000 2014 年 9 月 2 日 8:33:51 PM org.hibernate.engine.jdbc. spi.SqlExceptionHelper logExceptions エラー: 親行を削除または更新できません: 外部キー制約が失敗しました (
forum
.post_tbl
, CONSTRAINTFK_bfbv5nknqj7ppd5630scimhtb
FOREIGN KEY (ThreadID_thread_id
) REFERENCESthread_tbl
(thread_id
)) org.hibernate.exception.ConstraintViolationException: 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.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) は org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58) で(AbstractEntityPersister.java:3343) org.hibernate.persister で。entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3546) at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:369) で org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:293) で org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions で(AbstractFlushingEventListener.java:339) org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) org.hibernate.internal. org.hibernate.engine.transaction.internal.jdbc の SessionImpl.managedFlush(SessionImpl.java:404)。test.main(test.java:84) での org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) での JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 原因: com.mysql.jdbc .exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 親行を削除または更新できません: 外部キー制約が失敗します (forum
.post_tbl
、制約のFK_bfbv5nknqj7ppd5630scimhtb
外部キー (ThreadID_thread_id
) 参照thread_tbl
(thread_id
)) HibernateException : sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) で sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) で、sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) でステートメントを実行できませんでしたjava.lang.reflect.Constructor.newInstance(Constructor.java:408) 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:4120) で com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 4052) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) で com.mysql.jdbc.MysqlIO で。com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) の sqlQueryDirect (MysqlIO.java:2664) com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) の com.mysql.jdbc.PreparedStatement com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) の .executeUpdate(PreparedStatement.java:2458) org.hibernate.engine の com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で。 jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)executeUpdate(PreparedStatement.java:2458) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)executeUpdate(PreparedStatement.java:2458) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)
これから抜け出す方法を見つけるのを手伝ってください。