Hibernate OnDelete Cascade不适用于MySql但适用于postgres和Ms-Sql

Rak*_*akz 5 java mysql hibernate jpa hibernate-cascade

我有两个实体.使用Post-> Thread的 OnetoOne映射的线程实体和Post实体.

一个线程实体包含许多文章.我知道我应该使用OnetoMany而不是OnetoOne,但为了避免所有收集问题我正在使用OnetoOne

现在的问题是,当我删除一个线程时,还必须删除与之关联的所有帖子.我成功地使用了它

@OnDelete(action = OnDeleteAction.CASCADE)
Run Code Online (Sandbox Code Playgroud)

但它只适用于Postgres和Ms-SQl,但不适用于MySql(也尝试过InnoDb).在上删除级联未在架构生成查询生成.

以下是代码

//Thread Entity
@Id
@GeneratedValue
@Column(name = "thread_id")
private int ThreadID;
Run Code Online (Sandbox Code Playgroud)
//Post Entity
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "post_id")
private int PostID;

@OneToOne()
@OnDelete(action = OnDeleteAction.CASCADE)
private thread ThreadID;
Run Code Online (Sandbox Code Playgroud)

我使用以下查询从Thread实体中删除项目时出现以下错误

session.delete(session.load(thread.class,1));
Run Code Online (Sandbox Code Playgroud)

2014年9月2日下午8:33:51 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN:SQL错误:1451,SQLState:23000 Sep 02,2014 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(NonBatchingB atch.java:58)在org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3343)在org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3546)在org.hibernate.action .internal.EntityDeleteAction.execute(EntityDeleteAction.java:100)在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.位于org.hibernate.engine.transaction的org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)的onFlush(DefaultFlushEventListener.java:52) .internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:1 01)atg.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)at test.main(test.java:84)引起:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:不能删除或更新父行:外键约束失败(forum.post_tbl,CONSTRAINT FK_bfbv5nknqj7ppd5630scimhtbFOREIGN KEY(ThreadID_thread_id)REFERENCES thread_tbl(thread_id))HibernateException:无法在sun.reflect.DelegatingConstructorAccessorImpl的sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)执行语句.在com.mysql.jdbc.Util的com.mysql.jdbc.Util.handleNewInstance(Util.java:411)的java.lang.reflect.Constructor.newInstance(Constructor.java:408)中的newInstance(DelegatingConstructorAccessorImpl.java:45) com.mysql.jdbc中的com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)中的.getInstance(Util.java:386)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120).位于com.mysql.jdbc.MysqlIO.qlndDirect(MysqlIO.java:2650)的com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)中的mysqlIO.checkErrorPacket(MysqlIO.java:4052)位于com.mysql.jdbc .ConnectionImpl.execSQL(ConnectionImpl.java:2794)at co.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)at co m.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)在com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)在com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)在org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)... 14更多BUILD SUCCESSFUL(总时间:2秒)

请帮我找到解决方法.

Jun*_*Jun 13

这就是我基于Spring Boot解决这个问题的方法.

// application.properties  
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
Run Code Online (Sandbox Code Playgroud)

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
Run Code Online (Sandbox Code Playgroud)

解释
如下所示,似乎MySQL5InnoDBDialect.java中CascadeDelete的默认值仅支持Cascade.

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

// MySQL5InnoDBDialect.java
@Override
    public boolean supportsCascadeDelete() {
        return true;
    }
Run Code Online (Sandbox Code Playgroud)