无法添加或更新子行:外键约束失败 \- 休眠中的双向映射

新手上路,请多包涵

嗨,我有一个关于 JPA 的问题……

D B:

数据库

Java 类(不相关的字段被省略):

用户:

 @Entity
public class User{
    @Id
    private int iduser;

    //bi-directional many-to-one association to UserInfo
    @OneToMany(mappedBy="user", cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
    private List<UserInfo> userInfos;
}

用户信息:

 @Entity
@Table(name="user_info")
public class UserInfo {
    @Id
    @Column(name="iduser_info")
    private int iduserInfo;

    //bi-directional many-to-one association to User
    @ManyToOne
    private User user;
}

目前,当我尝试这样做时(我再次省略了设置不相关的字段):

 User u = new User();
UserInfo info = new UserInfo();
u.addUserInfo(info);

em.persist(u); // save user

我收到此错误:

 Cannot add or update a child row: a foreign key constraint fails (`webstore`.`user_info`, CONSTRAINT `fk_user_info_user` FOREIGN KEY (`user_iduser`) REFERENCES `user` (`iduser`) ON DELETE NO ACTION ON UPDATE NO ACTION)

我整天都在敲脑袋,我想不通……我也在这里搜索了解决方案,但他们都建议这个错误表明我想在没有输入user_iduser值的情况下输入UserInfo,但即使我添加这之前坚持:

 info.setUser(u);

它仍然不起作用 - 双向映射甚至支持级联吗?期望的效果是应该插入用户,然后在它引用原始用户之后插入列表中的所有用户信息。我怎样才能做到这一点?

我不想做

SET foreign_key_checks = 0/1;

每次=(

原文由 BizzyDizzy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 409
2 个回答

尝试:

 @ManyToOne
@JoinColumn(name="user_iduser", nullable=false)
private User user;

然后看看这是否有效。我假设在 user_info 表中, user_id 字段是 NOT NULL 在你的 RDBMS 中。此外,由于它是双向的,因此您必须在 UserInfosetXXX 上 --- User

 User u = new User();
UserInfo info = new UserInfo();
info.setUser(u);
u.addUserInfo(info);

em.persist(u); // save user


更新: 您确定要为 UserUserInfo 指定一个 ID 吗?看起来 ID 未设置,因此没有参考链接 UserInfoUser

如果ID是 AUTO_INCREMENT ,则在 @Id 注解后添加:

 @GeneratedValue(strategy=GenerationType.IDENTITY)

原文由 Buhake Sindi 发布,翻译遵循 CC BY-SA 3.0 许可协议

我也有这个错误,通过在 iduser 上添加 @GeneratedValue(strategy = GenerationType.IDENTITY) 注释修复了这个错误,你必须有外键 CASCADE ON DELETE,UPDATE。

原文由 Xan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题