栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JPA在MySQLIntegrityConstraintViolationException中插入父/子结果

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JPA在MySQLIntegrityConstraintViolationException中插入父/子结果

您的关系不必是双向的。这里的评论中有一些错误信息。

您还说过,您已将字段“
parentId”添加到Child实体中,因为您假设JPA需要“了解”父字段,以便它可以设置值。问题不是基于您提供的注释,JPA不了解该字段。问题是您提供了有关该字段的“太多”信息,但是这些信息在内部是不一致的。

在“父项”中将字段和注释更改为:

@oneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)@JoinColumn(name = "parent_id")private List<Child> children;

然后从子实体中完全删除“
parentId”。您先前已经指定了JoinTable批注。但是,您想要的不是JoinTable。JoinTable将创建另一个第三表,以使两个实体相互关联。您只需要一个JoinColumn。将JoinColumn批注添加到也用OneToMany批注的字段后,您的JPA实现将知道您正在将FK添加到CHILD表中。问题在于JPA的CHILD表已经定义了parent_id列。

考虑一下,您给它提供了CHILD表和parent_id列的两个冲突定义。在一种情况下,您已经告诉您JPA它是一个实体,而parent_id只是该实体中的一个值。在另一方面,您已经告诉JPA您的CHILD表不是实体,而是用于在CHILD和PARENT表之间创建外键关系的。问题是您的CHILD表已经存在。然后,当您保留实体时,您已经告诉它parent_id显式为null(未设置),但是您还告诉它应该更新parent_id以设置对父表的外键引用。

我通过上述更改修改了您的代码,并且我也称“持久”而不是“合并”。

这导致了3个SQL查询

insert into PARENT (ID) values (default)insert into CHILD (ID) values (default)update CHILD set parent_id=? where ID=?

这充分反映了您想要的东西。PARENT条目已创建。创建CHILD条目,然后更新CHILD记录以正确设置外键。

如果您改为添加注释

@oneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)@JoinColumn(name = "parent_id", nullable = false)private List<Child> children;

然后在插入子项时将运行以下查询

insert into CHILD (ID, parent_id) values (default, ?)

因此从一开始就正确设置FK。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号