2014-09-02 120 views
3

我有2個實體。 主題實體和帖子實體使用OnetoOne映射帖子 - >帖子。Hibernate OnDelete Cascade不適用於MySql,但適用於postgres和Ms-Sql

一個主題實體包含許多帖子。我知道我應該用來代替OnetoOne一對多,但爲了避免所有類別的問題我使用OnetoOne

現在的問題是,當我刪除線程,與此相關的後所有還必須被刪除。 我成功地做它用

@OnDelete(action = OnDeleteAction.CASCADE) 

但它僅適用於Postgres的和女士-SQL,但是不能在MySQL的(InnoDB的嘗試爲好)。在模式生成查詢中未生成刪除級聯

以下是代碼

//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; 

我收到以下錯誤,而使用下面的查詢

session.delete(session.load(thread.class,1)); 

Sep 02, 2014 8:33:51 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 1451, SQLState: 23000 Sep 02, 2014 8:33:51 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Cannot delete or update a parent row: a foreign key constraint fails (forum . post_tbl , CONSTRAINT FK_bfbv5nknqj7ppd5630scimhtb FOREIGN KEY (ThreadID_thread_id) REFERENCES thread_tbl (thread_id)) org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3343) at 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) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:293) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) at test.main(test.java:84) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (forum . post_tbl , CONSTRAINT FK_bfbv5nknqj7ppd5630scimhtb FOREIGN KEY (ThreadID_thread_id) REFERENCES thread_tbl (thread_id)) HibernateException : could not execute statement at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 more BUILD SUCCESSFUL (total time: 2 seconds)

主題實體刪除項目請幫我找到一個出路。

回答

9

這是我根據Spring Boot解決這個問題的方法。

解決方案

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

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

Explnation
正如你可以看到下面,好像在爲MySQL5InnoDBDialect.java的CascadeDelete默認值只支持Cas凱德。

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

// MySQL5InnoDBDialect.java 
@Override 
    public boolean supportsCascadeDelete() { 
     return true; 
    } 
+0

失落的時間追捕這個問題。 CascadeType不起作用,你需要專門使用@OnDelete加上方言是錯誤的。這兩個修復程序的組合爲我工作。 – cen 2015-07-08 14:15:10

+0

@cen 當然,你需要在場上@OnDelete(action = OnDeleteAction.CASCADE),並且我不遵循「方言是錯誤的」,你能否給我更詳細的哪種方言是錯誤的? – Jun 2015-07-09 02:09:52

+0

我只是確認你的方言改變的解決方案。 – cen 2015-07-09 07:33:43

相關問題