5

私は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, CONSTRAINT FK_bfbv5nknqj7ppd5630scimhtbFOREIGN KEY ( ThreadID_thread_id) REFERENCES thread_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 秒)

これから抜け出す方法を見つけるのを手伝ってください。

4

1 に答える 1

14

これは、Spring Boot に基づいてこの問題を解決するために行ったことです。

解決

から

// application.properties  
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect


以下に示すように、MySQL5InnoDBDialect.java の CascadeDelete のデフォルト値は Cascade のみをサポートしているようです

// MySQLDialect.java
@Override
    public boolean supportsCascadeDelete() {
        return false;
    }

// MySQL5InnoDBDialect.java
@Override
    public boolean supportsCascadeDelete() {
        return true;
    }
于 2015-03-09T13:50:29.263 に答える