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