Hibernate:无法添加或更新子行:外键约束失败
Posted
技术标签:
【中文标题】Hibernate:无法添加或更新子行:外键约束失败【英文标题】:Hibernate :Cannot add or update a child row: a foreign key constraint fails 【发布时间】:2011-08-03 03:43:28 【问题描述】:我有这个问题:
无法添加或更新子行:a 外键约束失败 (
bytecodete
.company_links
, 约束FK_company_links_1
外键 (id
) 参考company
(idUser
) 删除级联 更新级联)
但我不太明白会发生这种情况,所以我将在此处发布我的表格:
//USER TABLE
DROP TABLE IF EXISTS `bytecodete`.`user`;
CREATE TABLE `bytecodete`.`user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`type` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
)
//COMPANY TABLE
DROP TABLE IF EXISTS `bytecodete`.`company`;
CREATE TABLE `bytecodete`.`company` (
`idUser` int(11) NOT NULL,
`fantasyName` varchar(55) NOT NULL,
`corporateName` varchar(55) NOT NULL,
`cnpj` varchar(14) NOT NULL,
PRIMARY KEY (`idUser`),
UNIQUE KEY `cnpj` (`cnpj`),
CONSTRAINT `company_ibfk_1` FOREIGN KEY (`idUser`) REFERENCES `user` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
)
// COMPANY_LINKS TABLE
DROP TABLE IF EXISTS `bytecodete`.`company_links`;
CREATE TABLE `bytecodete`.`company_links` (
`id` int(11) NOT NULL DEFAULT '0',
`idCompany` int(10) unsigned NOT NULL,
`serviceName` varchar(45) NOT NULL,
`link` varchar(45) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
CONSTRAINT `FK_company_links_1` FOREIGN KEY (`id`) REFERENCES `company` (`idUser`)
ON DELETE CASCADE ON UPDATE CASCADE
)
我知道当我尝试在有外键的表中插入一些东西并且我没有为此键设置一些值时,会出现此异常。 但这不是我的情况,这是我的输出:
11:47:30,809 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate:
insert
into
bytecodete.user
(email, password, type)
values
(?, ?, ?)
11:47:30,948 TRACE StringType:133 - binding 'valter.bcc@gmail.com' to parameter: 1
11:47:30,949 TRACE StringType:133 - binding 'U25YM/DOl5k=' to parameter: 2
11:47:30,950 TRACE IntegerType:133 - binding '2' to parameter: 3
Hibernate:
insert
into
bytecodete.company
(cnpj, corporateName, fantasyName, idUser)
values
(?, ?, ?, ?)
11:47:31,214 TRACE StringType:133 - binding '98806728000100' to parameter: 1
11:47:31,215 TRACE StringType:133 - binding 'Semana da Computação e Tecnologia' to parameter: 2
11:47:31,215 TRACE StringType:133 - binding 'SECOT' to parameter: 3
11:47:31,216 TRACE IntegerType:133 - binding '37' to parameter: 4
idCompany=37
Hibernate:
select
company_.idUser,
company_.cnpj as cnpj9_,
company_.corporateName as corporat3_9_,
company_.fantasyName as fantasyN4_9_
from
bytecodete.company company_
where
company_.idUser=?
11:47:31,300 TRACE IntegerType:133 - binding '37' to parameter: 1
11:47:31,316 TRACE StringType:172 - returning '98806728000100' as column: cnpj9_
11:47:31,316 TRACE StringType:172 - returning 'Semana da Computação e Tecnologia' as column: corporat3_9_
11:47:31,351 TRACE StringType:172 - returning 'SECOT' as column: fantasyN4_9_
Hibernate:
insert
into
bytecodete.company_links
(idCompany, link, serviceName, id)
values
(?, ?, ?, ?)
11:47:31,353 TRACE IntegerType:133 - binding '37' to parameter: 1
11:47:31,354 TRACE StringType:133 - binding 'http://www.flickr.com/services/api/' to parameter: 2
11:47:31,354 TRACE StringType:133 - binding 'Flickr' to parameter: 3
11:47:31,355 TRACE IntegerType:133 - binding '0' to parameter: 4
11:47:31,433 WARN JDBCExceptionReporter:77 - SQL Error: 1452, SQLState: 23000
11:47:31,452 ERROR JDBCExceptionReporter:78 - Cannot add or update a child row: a foreign key constraint fails (`bytecodete`.`company_links`, CONSTRAINT `FK_company_links_1` FOREIGN KEY (`id`) REFERENCES `company` (`idUser`) ON DELETE CASCADE ON UPDATE CASCADE)
对不起,打扰你了,但我真的需要帮助,我不知道发生了什么。
最好的问候, 瓦尔特·恩里克。
【问题讨论】:
【参考方案1】:看起来您的参数顺序混淆了。您的插入语句是:
insert into bytecodete.company_links (idCompany, link, serviceName, id) values (?, ?, ?, ?)
您将 37 绑定到参数 1 (idCompany),将 0 绑定到参数 4 (id)。 id 必须是 37,而不是 0。
【讨论】:
37是我公司的id,0是我的表company_links的id。 但是您从 company_links 到 company 的外键位于 company_links.id 列中。听起来它应该在 idCompany 列上。【参考方案2】:我们可能需要查看一些代码来为您提供更多帮助,但仅基于 INSERT 语句,您的外键从 company_links
到 company
似乎是错误的。您的 INSERT 到 company_links
的 idCompany
为 37,id
的为 0。你的外键设置在id
,而不是idCompany
,所以37应该设置在id
,或者外键改成idCompany
。
【讨论】:
以上是关于Hibernate:无法添加或更新子行:外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章