Java Hibernate在尝试使用合并方法更新对象时引发DataIntegrityViolationException
以前的Java Hibernate在尝试使用合并方法更新对象时引发DataIntegrityViolationException,java,mysql,hibernate,Java,Mysql,Hibernate,以前的update()方法抛出了具有相同标识符值的不同对象,该对象已与会话关联,因此我将dao更改为。现在它给出了org.springframework.dao.DataIntegrityViolationException:cannotexecute语句;SQL[n/a];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句 TeamDAOImpl public void updateTeam(Tea
update()
方法抛出了具有相同标识符值的不同对象,该对象已与会话关联,因此我将dao更改为。现在它给出了org.springframework.dao.DataIntegrityViolationException:cannotexecute语句;SQL[n/a];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句
TeamDAOImpl
public void updateTeam(Team team) {
Team teamToUpdate = getTeam(team.getId());
teamToUpdate.setName(team.getName());
teamToUpdate.setRating(team.getRating());
Set<TeamMember> teamMember = team.getTeamMembers();
teamToUpdate.setTeamMembers(teamMember);
getCurrentSession().merge(teamToUpdate);
}
错误o.h.e.jdbc.spi.SqlExceptionHelper-无法添加或更新子级
行:外键约束失败(db
团队成员
,
约束FK_成员\u id
外键(id
)引用Member
(id
)删除时无操作更新时无操作)
数据:
CREATE TABLE `member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `teams` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`rating` int(11) NOT NULL,
`FK_Organization_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_Organization_id` (`FK_Organization_id`),
CONSTRAINT `FK_Organization_id` FOREIGN KEY (`FK_Organization_id`) REFERENCES `organization` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `team_member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`FK_Member_id` int(11) NOT NULL,
`FK_Team_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_Member_id` FOREIGN KEY (`id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_Team_id` FOREIGN KEY (`id`) REFERENCES `teams` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
更新3
public Team getTeam(int id) {
Team team = (Team) getCurrentSession().get(Team.class, id);
return team;
}
更新4
P6Spy帮助发现错误查询:
insert into team_member (FK_Team_id, FK_Member_id) values (2, 2);
返回:
[SQL] insert into team_member (FK_Team_id, FK_Member_id) values (2, 2);
[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (`db`.`team_member`, CONSTRAINT `FK_Member_id` FOREIGN KEY (`id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
问题出现在团队成员表中的约束定义中。而不是:
CONSTRAINT `FK_Member_id` FOREIGN KEY (`id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_Team_id` FOREIGN KEY (`id`) REFERENCES `teams` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
一定是这样
CONSTRAINT `FK_Member_id` FOREIGN KEY (`FK_Member_id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_Team_id` FOREIGN KEY (`FK_Team_id`) REFERENCES `teams` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
这可能是级联的一个问题。为了进行测试,请尝试不设置团队成员,并尝试设置另一个字段(不使用cascade)以查看发生了什么。如果在TeamDAOImpl
中未设置团队成员,则该字段可以正常工作(更新除团队成员以外的所有成员)。您可以发布在执行更新()时提供的示例值吗或者合并..?所以您有Team teamToUpdate=getTeam(Team.getId())
,这基本上意味着团队
和团队更新
指向同一个团队,对吗?如果是,请尝试更改Set teamMember=team.getTeamMembers()
使用teamToUpdate.getTeamMembers()
teamToUpdate
是另一个从传递的team
中拾取更改的对象。建议的更改后没有错误,也没有更新
CONSTRAINT `FK_Member_id` FOREIGN KEY (`FK_Member_id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_Team_id` FOREIGN KEY (`FK_Team_id`) REFERENCES `teams` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION