2014-09-02 2 views
3

2 개의 엔티티가 있습니다. 스레드 엔티티 및 포스트 에서 OnetoOne 매핑을 사용하여 포스트 엔티티 게시 - 스레드.Hibernate OnDelete Cascade는 MySQL에서는 작동하지 않지만 postgres와 Ms-SQL에서는 작동합니다.

스레드 엔티티 수많은 포스트를 포함한다. 난 내가 대신 OnetoOne의 OnetoMany 사용 했어야 알고 있지만, 모든 컬렉션 문제를 방지하기위한 나는 내가 스레드, 그와 관련된 모든 포스트을 삭제하면 이제 문제이며, 또한해야

OnetoOne

을 사용하고 있습니다 제거하십시오. 나는
@OnDelete(action = OnDeleteAction.CASCADE) 

를 사용하여 그 일을 성공적 해요 그러나 그것은 단지 포스트 그레스와 MS-SQL에 있지만 MySQL을 (시도 이노도)에서 작동합니다. 삭제 캐스케이드에있는 은 스키마 생성 쿼리에서 생성되지 않습니다. 다음

다음 쿼리

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)

를 사용 스레드 기업에서 항목을 삭제하는 동안

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

나는 다음과 같은 오류 코드에게 있습니다 이 문제를 해결할 수 있도록 도와주세요.

답변

9

이것은 스프링 부트를 기반으로이 문제를 해결하기 위해 수행 한 작업입니다.

솔루션

에서 아래 볼 수 있듯이, 그것은 MySQL5InnoDBDialect.java에서 CascadeDelete의 기본값처럼 보인다

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

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

Explnation
에 Cas 만 지원 캐드.

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

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

시간 낭비하는 시간. CascadeType이 작동하지 않습니다. 특히 @OnDelete를 사용해야하고 방언이 틀립니다. 이 두 수정 프로그램의 조합은 나를 위해 일했습니다. – cen

+0

@cen 물론, 필드에 @OnDelete (action = OnDeleteAction.CASCADE)가 필요하며 "방언이 잘못되었습니다"를 따르지 않습니다. 어떤 방언이 잘못되었는지 자세히 알려주시겠습니까? – Jun

+0

방금 ​​방언 변경에 대한 해결책을 확인했습니다. – cen

관련 문제