2017-04-09 157 views
0

我有2个表,订单和事务与一对多从订单映射到事务表中具有外键orderId的事务。外键约束失败,一对多

有些事务可能没有任何顺序,在这种情况下,orderId会变为0.有没有ID为0的订单。这是工作,直到我不得不删除表,让休眠再生他们。现在,当我尝试插入订单ID为0的事务时,会发生以下异常:

org.hibernate.exception.ConstraintViolationException: could not insert: [com.fundexpert.dao.Transaction] 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666) 
     at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) 
     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) 
     at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
     at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:534) 
     at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:526) 
     at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241) 
     at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:291) 
     at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:239) 
     at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:192) 
     at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:319) 
     at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:265) 
     at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:242) 
     at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:192) 
     at org.hibernate.engine.Cascade.cascade(Cascade.java:153) 
     at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:479) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:357) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) 
     at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
     at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
     at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
     at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562) 
     at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550) 
     at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546) 
     at com.fundexpert.controller.Store.existingUser(Store.java:408) 
     at com.fundexpert.controller.Store.sFactory(Store.java:160) 
     at com.fundexpert.servlet.upload.PdfRun.doPost(PdfRun.java:124) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:221) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`fundexpert`.`transaction`, CONSTRAINT `FK7FA0D2DE80F6DF09` FOREIGN KEY (`orderId`) REFERENCES `orders` (`id`)) 
     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:423) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
     at com.mysql.jdbc.Util.getInstance(Util.java:381) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1016) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3376) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3308) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2543) 
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1737) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2022) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1940) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1925) 
     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) 
     at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) 
     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) 
     ... 59 more 
+0

你能分享一些代码吗 –

回答

0

您无法将orderId设置为0.它只能是有效值或null。可能你不允许在外键中使用空值。您应该添加到多对一注释可选=真

@ManyToOne(optional = true) 

你也需要应用修订后重新创建一个表,休眠模式生成无法删除的约束。