Hibernate OnDelete Cascade不适用于MySql,但适用于postgres和Ms-Sql
我有两个实体。 使用Post-> Thread的 OnetoOne映射的线程实体和Post实体。
Thread实体包含许多post 。 我知道我应该使用OnetoMany而不是OnetoOne,但为了避免所有收集问题我正在使用OnetoOne
现在的问题是,当我删除一个线程时 ,所有与之关联的post也必须被删除。 我成功地使用了它
@OnDelete(action = OnDeleteAction.CASCADE)
但它仅适用于Postgres和Ms-SQl,但不适用于MySql(也尝试过InnoDb)。 在模式生成查询中不生成on delete cascade 。
以下是代码
//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 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
,CONSTRAINTFK_bfbv5nknqj7ppd5630scimhtb
FOREIGN KEY(ThreadID_thread_id
)REFERENCESthread_tbl
(thread_id
))org.hibernate.exception.ConstraintViolationException:无法执行语句at org.hibernate.exception.inpate中的org.hibernate.exception.invert.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)org.hibernate.engine.jandc.spi.SqlExceptionHelper上的org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)。转换(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.persm.com上的org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3343) .AbstractEntityPersister.delete(AbstractEntityPersister.java:3546)atg.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100)at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)at at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)位于org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions的org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:293)在org.hibernate.internal.SessionImpl上的org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)中的AbstractFlushingEventListener.java:339) .managedFlush(SessionImpl.java:404)org.hibernate.engine.tran 在test.main(test.java:84)的org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)的saction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)引起的:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(forum
。post_tbl
,CONSTRAINTFK_bfbv5nknqj7ppd5630scimhtb
FOREIGN KEY(ThreadID_thread_id
)REFERENCESthread_tbl
(thread_id
))HibernateException:无法在thread_tbl
(ThreadID_thread_id
)的thread_tbl
(Native Method)执行语句.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)位于com.mysql.jdbc.Util.handleNewInstance(Util.java:411)的java.lang.reflect.Constructor.newInstance(Constructor.java:408)中。 mysql.jdbc.Util.getInstance(Util.java:386)位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)的com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)at com .mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)位于com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)的com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)at at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)at com.m ysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)的com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)at com .mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)… 14更多BUILD SUCCESSFUL(总时间:2秒)
请帮我找到解决方法。
这就是我基于Spring Boot解决这个问题的方法。
解
从
// application.properties spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
至
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
Explnation
如下所示,似乎MySQL5InnoDBDialect.java中CascadeDelete的默认值仅支持Cascade。
// MySQLDialect.java @Override public boolean supportsCascadeDelete() { return false; } // MySQL5InnoDBDialect.java @Override public boolean supportsCascadeDelete() { return true; }