将子实体持久化操作级联到其父实体

2024-03-21

我有一个OneToMany与我使用 Hibernate 注释设置的两个实体的关联。这Child该关联的实体有一个由外键组成的复合主键parent列和另一个标识符childName。当我尝试通过保存子实体将提交级联到父级时,这似乎会导致“引用完整性约束违规”。

我创建了一个简单的问题工作示例,该示例从我使用这种关系建模的实际场景中抽象出来,但这意味着我知道问题是由于这种关联和使用复合主键造成的。

为什么我不能通过保存子实体来提交两个实体?为什么它违反了外键约束?

主要测试方法*:

// Create some detached entities
Parent p = new Parent();
p.setName("Fooson");

// New child id
Child.ChildPK pk = new Child.ChildPK();
pk.setParentName(p);
pk.setChildName("Barty");     

// Set id to new Child
Child c = new Child();
c.setChildPK(pk);

// Add child to parent
p.getChildren().add(c);

// Saving the parent
// service.parentDao.save(p); // if this is uncommented, it works fine

// Cascade child and associated parents in one transaction
service.childDao.save(c); // ConstraintViolationException

孩子.java

@Entity
@Table(name="Child")
public class Child implements Serializable {

    @EmbeddedId
    private ChildPK id;

    public ChildPK getChildPK() {
        return id;
    }

    public void setChildPK(ChildPK childPK) {
        this.id = childPK;
    }

    @Embeddable
    public static class ChildPK implements Serializable 
    {
        @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="name")
        Parent parent;

        @Column(name="childName")
        String childName;

        public Parent getParentName() {
            return parent;
        }

        public void setParentName(Parent parentName) {
            this.parent = parentName;
        } 

        public String getChildName() {
            return childName;
        }

        public void setChildName(String childName) {
            this.childName = childName;
        }

        @Override
        public int hashCode() {
            int hash = 5;
            hash = 67 * hash + Objects.hashCode(this.parent);
            hash = 67 * hash + Objects.hashCode(this.childName);
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final ChildPK other = (ChildPK) obj;
            if (!Objects.equals(this.parent, other.parent)) {
                return false;
            }
            return Objects.equals(this.childName, other.childName);
        }

        @Override
        public String toString() {
            return "ChildPK{" + "parentName=" + parent.getName() + ", childName=" + childName + '}';
        }

    }

    @Override
    public String toString() {
        return "Child{" + "id=" + id + '}';
    }

}

父类.java

@Entity
@Table(name="Parent")
public class Parent implements Serializable {

    @Id
    @Column(name="name")
    private String name;

    @OneToMany(mappedBy="id.parentName", cascade=CascadeType.ALL)
    Set<Child> children = new HashSet<>(0);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Child> getChildren() {
        return children;
    }

    public void setChildren(Set<Child> children) {
        this.children = children;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 73 * hash + Objects.hashCode(this.name);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Parent other = (Parent) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Parent{" + "name=" + name + ", children=" + children + '}';
    }

}

完整的异常消息是:

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: 
Could not execute JDBC batch update
...
Caused by: org.h2.jdbc.JdbcBatchUpdateException: 
Referential integrity constraint violation: 
"FK3E104FCBA07683D: PUBLIC.CHILD FOREIGN KEY(NAME) REFERENCES 
PUBLIC.PARENT(NAME) ('Fooson')"; SQL statement:
insert into Child (childName, name) values (?, ?)
...

* main 方法指的是 DAO 和 ServiceLayer 对象,我在这里没有显示,因为我认为它与问题无关。不过,如果需要,我可以发布这些内容。


将保存操作从子实体级联到父实体是没有意义的,反之亦然。

这是因为操作将是:

  • 拯救孩子
  • 将保存操作传播到父级

但 Child 依赖 Parent.id 来设置其 FK。

您还需要从数据库角度可视化此操作流程。你能拯救一个引用不存在的父母的孩子吗?当然不是。

想想当您删除子实体时会发生什么。级联将传播到父级,然后传播到其所有子级。

因此,您必须从 Embeddable 类中删除级联:

@ManyToOne(cascade=CascadeType.ALL)

并取消注释正常工作的代码:

// Saving the parent
service.parentDao.save(p); // if this is uncommented, it works fine
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将子实体持久化操作级联到其父实体 的相关文章

  • 如何使用 Jsoup 获取包含非 ASCII 字符(ą、ś ...)的 URL?

    我正在使用 jsoup 解析一些波兰网站 但我对 URL 中的 等特殊字符有问题example com k t读起来像example com k 每个没有这个特殊字符的查询都可以完美运行 我努力了Document doc Jsoup par
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 为什么连接器没有使用我的 Tomcat 6 执行程序线程池?

    我的 server xml 如下所示
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • Spring MVC 和 Struts MVC 之间的区别 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Spring MVC 和 Struts MVC 之间的主要区别是什么 Spring MVC 和 Struts 之间的主要区别是 Spr
  • 获取文本文件中行的字节偏移量?

    我有一个文本文件 例如 one two three four five 我需要获取文件中每一行的偏移量 我如何在 Java 中做到这一点 我搜索了一些 I O 库 如 BufferedReader 和 RandomAccessFile 但我
  • Cognito SRP 身份验证 JAVA SDK

    我正在尝试使用 Cognito 验证 Java 应用程序 我在Python中使用了warrant库 效果非常好 但我现在想在java中做同样的事情 我的 Python 函数用于身份验证warrant https github com cap
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • xclock 工作,X11 DISPLAY 设置但仍然 java.awt.HeadlessException:

    获取 java awt HeadlessException 似乎是一个非常常见的问题 并且 中已经讨论过 以下问题 没有 X11 DISPLAY 变量 这是什么意思 https stackoverflow com questions 662
  • toArray 与预先确定大小的数组

    使用时ar toArray new String ar size 安卓工作室3 2 1警告预先确定大小的数组并建议空数组 有两种方式将集合转换为数组 使用 预先确定大小的数组 如 c toArray new String c size 或使
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • 如何使用现代.fxml和controller.java在javafx 2.x中制作自动完成组合框[重复]

    这个问题在这里已经有答案了 如何使用现代 fxml 和controller java 在 javafx 2 x 中制作一个类似的自动完成组合框 就像制作这个一样 http blog ngopal com np 2011 07 04 auto
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 确保 MAVEN_HOME 设置正确

    这里是 Java 和 Maven 菜鸟 使用 OSX 10 8 并使用 HomeBrew 安装 Maven 1 如果我说which mvn我会得到这个 usr local bin mvn 2 如果我说echo MAVEN HOME我不会得到

随机推荐

  • touchmove 事件不会在 Android 版谷歌浏览器上触发

    这是针对 客户签名 组件的反应 touchmove 事件不会在 Android 版 Google Chrome 浏览器上触发 我使用的是三星 Galax 平板电脑 a 2016 我通过 USB 控制台将平板电脑连接到我的电脑 在我的 com
  • bash: /usr/local/android-sdk-linux/tools/android: 权限被拒绝

    我正在尝试在 Ubuntu 上安装手机间隙 我遵循了所有必要的步骤并在 Ubuntu 上成功安装了 android sdk 但是当我在终端中输入 android 时 它显示权限被拒绝 我如何更改权限 错误是 bash usr local a
  • PHP 中 echo、echo()、print 和 print() 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的 echo 和 print 有何不同 https stackoverflow com questions 234241 how are echo and print different i
  • Python根据值绘制不同颜色的散点图

    我有一个数据框 我想绘制散点图 数据框看起来像 year length Animation 0 1971 121 1 1 1939 71 1 2 1941 7 0 3 1996 70 1 4 1975 71 0 我希望散点图中的点具有不同的
  • 启用了 selinux 的 Docker - 不允许在 /usr 中重新标记内容

    我在 Centos7 上安装了 Docker 并将 selinux 设置为在主机上强制执行 并且 Docker 守护进程以 selinux enabled 标志启动 当我尝试运行以下命令时 docker run it v usr local
  • 当用户注销 React Native 应用程序时,如何删除 Firebase Cloud Messaging Token?

    我使用 React Native FCM 进行消息传递 当用户注销应用程序时 我想删除 FCM 令牌 以便用户不会再次收到通知 下面是我的注销代码 signOutAsync async gt this logoutEvent API pos
  • Kivy Popup渲染问题

    我正在开发一个公交车司机应用程序 偶尔 应用程序 通过服务器 订阅的 MQTT 主题上会发布消息 当出现此类消息时 必须出现弹出窗口 我定制了默认的 Kivy 弹出窗口 更改了背景 添加了带有标签和按钮的 FloatLayout 作为内容
  • 如何使用 LINQ to SQL 创建排名搜索结果?

    我正在寻找一种使用 l2s 根据关键字返回排名结果的方法 我想使用一个关键字并能够使用该关键字在表中搜索该关键字 contains 我无法弄清楚的技巧是如何计算该 keyqord 出现的次数 然后 OrderByDescending 根据该
  • 计算 2D 向量叉积

    来自维基百科 叉积是a中两个向量的二元运算三维欧几里得空间产生另一个向量 该向量垂直于包含两个输入向量的平面 鉴于该定义仅定义为三个 或七 一和零 https en wikipedia org wiki Seven dimensional
  • 为什么 jQuery 无法在 Facebook 中加载?

    情况 我正在编写一个适用于任何页面的 Chrome 扩展 问题问题 我无法将 jQuery 加载到 Facebook 我想了解发生了什么 假设 Facebook 拥有一些超先进的技术 可以以某种方式检测到 当 jQuery 通过 chrom
  • LINQ To SQL 异常:本地序列不能在查询运算符(Contains 运算符除外)的 LINQ to SQL 实现中使用

    考虑这个 LINQ To SQL 查询 其目的是获取搜索词的 string 并将这些词应用到 SQL 表上的一堆不同字段 string searchTerms new string hello world foo List
  • JDK 可以使用 apt-get install 吗?

    我使用 Linux 机器还不到两周 所以我对 Linux 非常陌生 我还想安装 Java 开发人员工具包 这应该怎么做呢 有没有一个apt get命令 或者我应该单击 Sun 网站上的下载按钮 我确信有不止一种方法可以做到这一点 而且可能并
  • 在 iOS 中围绕枢轴点旋转 ImageView

    记录和旋转搜索栏 我在下面有一个应用程序屏幕来录制 最多 30 秒 音频 如何在录制音频时平滑地将小圆圈旋转为虚线圆线上的搜索栏 当小圆圈沿线旋转时 如何填充虚线 Thanks 答案是有两种方法可以使用PanGesture并自动使用Time
  • Java 7 未签名小程序权限 1.7.0_45

    我们有一个需要某些权限的小程序 我们对其进行签名并授予所有权限 然而 在开发时我们使用未签名的小程序 我们在用户主目录中的 java policy 文件中设置所有权限 这在 1 7 0 45 或可能 40 中已停止工作 因为未签名的小程序不
  • 有什么方法可以检查 Python 文件是否符合 Numpy 文档风格? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个需要 Numpy 文档的项目 在我的 Java 时代 我记得有 linter 来检查 E
  • Angular 2 document.removeEventListener 在类中不起作用

    操作结束时我无法删除事件 我通过单击启动事件 span class leftTopPoint span export class SectionComponent initResize e void this mouseX e client
  • 在 JavaScript 中将一个数组附加到另​​一个数组[重复]

    这个问题在这里已经有答案了 这个问题与以下问题完全相同 如何将数组附加到现有的 JavaScript 数组 https stackoverflow com questions 1374126 how to append an array t
  • 无法通过ldap3 Python3更改用户密码

    每当我尝试通过 ldap3 库更改某人的密码时 都会收到以下错误 type modifyResponse result 53 message 0000001F SvcErr DSID 031A12D2 problem 5003 WILL N
  • C# 中的 MS Word 插件文本更改事件

    我有一个 Microsoft Word 插件 可以在文本中查找相似的单词 但是当我单击按钮时 我的问题是 当用户输入单词时如何调用函数 换句话说 当用户键入以获取当前单词并处理它并获取它的相似单词时 我想要一个像 TextChange 或
  • 将子实体持久化操作级联到其父实体

    我有一个OneToMany与我使用 Hibernate 注释设置的两个实体的关联 这Child该关联的实体有一个由外键组成的复合主键parent列和另一个标识符childName 当我尝试通过保存子实体将提交级联到父级时 这似乎会导致 引用