2015-04-20 23 views
0
CREATE TABLE `events` (
    `raceday` date NOT NULL, 
    `meeting_number` smallint(6) NOT NULL, 
    `event_number` smallint(6) NOT NULL, 
,`event_number`), 
    CONSTRAINT `fk_events_race_meetings` FOREIGN KEY (`raceday`, `meeting_number`) REFERENCES `race_meetings` (`raceday`, `meeting_number`) ON DELETE CASCADE ON UPDATE CASCADE 
) 

ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `bet_types` (
    `ao_bet_type` varchar(5) NOT NULL, 
    `bet_type` smallint(6) NOT NULL, 
    `bet_type_description` varchar(50) DEFAULT NULL, 
    `other_bet_type` varchar(5) DEFAULT NULL, 
    `number_of_legs` smallint(6) DEFAULT NULL, 
    `display_order` smallint(6) DEFAULT NULL, 
    PRIMARY KEY (`bet_type`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 


CREATE TABLE `dividends` (
    `raceday` date NOT NULL, 
    `meeting_number` smallint(6) NOT NULL, 
    `event_number` smallint(6) NOT NULL, 
    `bet_type` smallint(6) NOT NULL, 
    `dividend_number` smallint(6) NOT NULL, 
    `pool_class` smallint(6) DEFAULT NULL, 
    `pool_result_type` smallint(6) DEFAULT NULL, 
    `dividend_type` smallint(6) DEFAULT NULL, 
    `dividend_or_accrual_cents` decimal(10,2) DEFAULT NULL, 
    `base_value` smallint(6) DEFAULT NULL, 
    `concession_dividend_flag` smallint(6) DEFAULT NULL, 
    `number_of_legs` smallint(6) DEFAULT NULL, 
    PRIMARY KEY (`raceday`,`meeting_number`,`event_number`,`bet_type`,`dividend_number`), 
    KEY `FKA113AE64360F4F38` (`bet_type`), 
    CONSTRAINT `FKA113AE64360F4F38` FOREIGN KEY (`bet_type`) REFERENCES `bet_types` (`bet_type`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fk_dividends_events` FOREIGN KEY (`raceday`, `meeting_number`, `event_number`) REFERENCES `events` (`raceday`, `meeting_number`, `event_number`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 




@Test 
    public void testDividend() 

    { 
     try 
     { 

      Dividend d = new Dividend(); 
      d.setEvent(new Event(new Date(),24,7)); 
      d.setBetType(new BetType(15)); 
      d.setDividendNumber(5); 
    /* HibernateUtil.saveOrUpdate(d, postgresSession, true);*/ 
     HibernateUtil.saveOrUpdate(d, mysqlSession, true); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
      e.getLocalizedMessage(); 

     } 
    } 

I am getting Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`ebet`.`dividends`, CONSTRAINT `fk_dividends_events` FOREIGN KEY (`raceday`, `meeting_number`, `event_number`) REFERENCES `events` (`raceday`, `meeting_number`, `event_number`) ON DELETE CASCA) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
    at com.mysql.jdbc.Util.getInstance(Util.java:384) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232) 

如何解決無法添加或更新子行,外鍵約束失敗如何解決無法添加或更新子行,外鍵約束失敗

+0

和子表中的數據也可用 –

+0

添加你的實體代碼/映射 – Zielu

回答

0
BetType betType = new BetType(15); 
betType.save(); 

BetType的該行沒有按數據庫表中不存在。該行必須與您在子表中使用的ID一起存在,然後輸入子記錄。

您直接添加子記錄而不添加父記錄。

+0

我在db級別手動添加它 –

+0

你確定所有關於父表的行嗎?所有你添加的值都已經在父表中了?爲什麼不使用save函數,因爲它是新增的...我可以看到你的hibernate util,真正結束了什麼?第三個arg? –

0

沒有看到它正在猜測的實體,但最有可能你的關係是由事件管理的,而非Divident,所以你需要在保存之前設置偶數對象上的Divide,並且你的OneToOne映射必須在Dividient上註明cascade = CascadeType.ALL

Dividend d = new Dividend(); 
Event e = new Event(new Date(),24,7); 
e.setDividient(d); 
d.setEvent(e); 

d.setBetType(new BetType(15)); 
d.setDividendNumber(5); 
HibernateUtil.saveOrUpdate(d, mysqlSession, true); 

或者,如果你不使用級聯,你需要明確的先保存事件,賭,然後紅利:

Session s = ... 
session.save(d.getEvent()); 
session.save(d.getBet()); 
session.save(d); 
3

是主要發生的是由於外鍵約束此問題。爲了避免這種情況,我簡單地使用 SET FOREIGN_KEY_CHECKS=0 它將刪除外鍵約束的影響,並在執行後再次使用 SET FOREIGN_KEY_CHECKS=1 繼續相同。

相關問題