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 :(得分:4)
此问题主要是由外键约束引起的。为了避免这种情况,我可以使用简单的技巧
SET FOREIGN_KEY_CHECKS=0
它将删除外键约束的影响,并在执行后再次使用
SET FOREIGN_KEY_CHECKS=1
继续相同。
答案 1 :(得分:0)
BetType betType = new BetType(15);
betType.save();
数据库表中不存在此行BetType。该行必须带有您在子表中使用的id,然后输入子记录。
您是在不添加父记录的情况下直接添加子记录。
答案 2 :(得分:0)
没有看到它正在猜测的实体,但很可能你的关系由Event而不是Divident管理,所以你需要在保存之前在偶数对象上设置Divident,并且你的OneToOne映射必须用cascade = CascadeType.ALL
注释在Dividient上:
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);