Hibernate 将重复项插入到 @OneToMany 集合中

2024-03-27

我有一个关于 Hibernate 3.6.7 和 JPA 2.0 的问题。

考虑以下实体(为简洁起见,省略了一些 getter 和 setter):

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private int id;

    @OneToMany(mappedBy="parent")
    private List<Child> children = new LinkedList<Child>();

    @Override
    public boolean equals(Object obj) {
        return id == ((Parent)obj).id;
    }

    @Override
    public int hashCode() {
        return id;
    }
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private int id;

    @ManyToOne
    private Parent parent;

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

    @Override
    public boolean equals(Object obj) {
        return id == ((Child)obj).id;
    }

    @Override
    public int hashCode() {
        return id;
    }
}

现在考虑这段代码:

// persist parent entity in a transaction

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Parent parent = new Parent();
em.persist(parent);
int id = parent.getId();

em.getTransaction().commit();
em.close();

// relate and persist child entity in a new transaction

em = emf.createEntityManager();
em.getTransaction().begin();

parent = em.find(Parent.class, id);
// *: parent.getChildren().size();
Child child = new Child();
child.setParent(parent);
parent.getChildren().add(child);
em.persist(child);

System.out.println(parent.getChildren()); // -> [Child@1, Child@1]

em.getTransaction().commit();
em.close();

子实体被错误地插入父实体的子实体列表中两次。

执行以下操作之一时,代码可以正常工作(列表中没有重复的条目):

  • 去除mappedBy父实体中的属性
  • 对子列表执行一些读取操作(例如取消注释行标记*)

这显然是一种非常奇怪的行为。此外,当使用 EclipseLink 作为持久性提供程序时,代码将按预期工作(无重复)。

这是 Hibernate 错误还是我遗漏了什么?

Thanks


这是 Hibernate 中的一个错误。令人惊讶的是,目前还没有报道,请随时举报 https://hibernate.onjira.com/secure/Dashboard.jspa.

针对未初始化惰性集合的操作会排队,以便在集合初始化后执行它们,并且 Hibernate 不会处理这些操作与数据库中的数据冲突的情况。通常这不是问题,因为该队列在flush(),并且可能的冲突更改将传播到数据库flush()以及。然而,一些变化(例如持久化具有由类型生成器生成的 id 的实体)IDENTITY,我想,这是你的情况)被传播到数据库,没有完整的flush(),并且在这些情况下可能发生冲突。

作为解决方法,您可以flush()坚持孩子后的会话:

em.persist(child); 
em.flush();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 将重复项插入到 @OneToMany 集合中 的相关文章

随机推荐

  • Api 网关:用于 Lambda 集成的 AWS 子域

    我正在尝试将我的 lambda 函数与 API 网关集成 该函数必须异步运行 因为它需要太长时间 我相信我必须选择 AWS 服务 并指定 Lambda 而不是选择 Lambda 集成类型 例如 this http docs aws amaz
  • callgrind:如何检查一行是否执行

    是否可以使用 callgrind 产生像 gcov lcov 给出的输出一样的输出 我正在阅读他们的文档 无法找到 callgrind annotate 的确切选项 这是不可能的 但 callgrind annotate 或 kcacheg
  • Web API 项目在部署时不会运行 - 无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0”

    当我部署 MVC 5 WEB API 项目时 我不断收到此错误 无法加载文件或程序集 Newtonsoft Json 版本 4 5 0 0 Culture neutral PublicKeyToken 30ad4fe6b2a6aeed 或其
  • Jquery 并将事件绑定到 iframe

    我目前正在使用 jquery textselect 插件根据页面上任何位置的选择文本来触发警报 并且它可以很好地执行以下操作 document ready function document bind textselect function
  • cron 作业替代品?

    我正在安装 Boonex 的 Dolphin 7 它要求我设置一个每 1 分钟运行一次的 cron 作业 然而 我的托管提供商允许我至少每 30 分钟运行一次 crons 我使用过 CMS 它有一个替代品 一个替代 cron 的脚本 有没有
  • Winforms 组件的父级/所有者[重复]

    这个问题在这里已经有答案了 从嵌入表单中的自定义 Winforms 组件中 如何获取父 所有者控件 我有一个 IContainer 并且 Site 属性不为空 但我不知道如何到达 真正的 父级 这是后续这个问题 https stackove
  • MongoDb:如果不存在,则将元素添加到数组[重复]

    这个问题在这里已经有答案了 我正在使用 node js 和 Mongodb 我是新使用 Mongod 的 我有一个这样的文档 Tag name string videoIDs array 这个想法是 服务器接收一个像这样的 JSON JSO
  • FOR /F 命令循环中的错误级别返回意外结果

    我正在尝试记录输出net stop同时还捕捉其ERRORLEVEL 基于这个问题 https stackoverflow com questions 3088712 我在嵌套子例程中尝试了以下操作 set a loopIndex 0 for
  • 如何在基于 php 的系统中的同一页面上显示登录错误消息?

    我正在构建一个基于 php 的登录系统 用户需要输入用户名和密码才能登录 我的问题是 如何在同一页面上显示 无效的用户名或密码 错误消息 我尝试了很多事情 包括尝试使用查询字符串 error 1 它确实通过在同一页面上显示错误消息来解决我的
  • 如何在python中读取Mat v7.3文件?

    我正在尝试阅读以下网站中给出的mat文件 ufldl stanford edu housenumbers 在文件train tar gz中 有一个名为digitStruct mat的mat文件 当我使用 scipy io 读取 mat 文件
  • 在 NetBeans 中禁用“保存快照”

    如何在 NetBeans 7 1 2 中禁用保存快照 它大大减慢了系统速度 有什么建议 这些快照是 IDE 检测到缓慢行为时拍摄的性能快照 由于显而易见的原因 速度较慢的计算机更有可能触发收集 通过花费比预设时间更长的时间来完成任务 然后需
  • 使用 Python 备份 Postgresql 数据库

    我想使用Python代码备份数据库 我想备份一些相关数据的表 如何备份以及如何使用 SELECT 语句选择所需的表 e g 我想获取一些表从 2014 05 01 到 2014 05 10 的数据 并将结果输出为 sql 扩展文件 如何使用
  • 从标头自动生成 C 代码

    我想生成头文件中定义的过程的空实现 理想情况下 它们应该为指针返回 NULL 为整数返回 0 等 并且在理想的情况下 还可以打印到 stderr 调用了哪个函数 这样做的动机是需要实现一个包装器 将复杂的现有 API 头文件 的子集适配到另
  • 适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议

    虽然这个问题可能是similar https stackoverflow com questions 929410 what are best practices for multi language database design to
  • CSS Sprite + 背景大小:覆盖

    有没有办法使用背景尺寸 封面在加载了 CSS Sprite 的图像上 示例代码 class img sprite background image url images sprite img png background repeat no
  • linux cron 作业是否应该用“&”指定以指示在后台运行? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在 crontab 文件中 是否应该使用尾随 来指定命令 还是命令会在后台运行 I have 20 home me monitor check sh
  • Symfony2:警告:spl_object_hash() 期望参数 1 为对象,给定整数

    我在实体之间有多对一的关系Project and Course因为每门课程可以有许多项目 所以许多项目可能与同一门课程相关 这些是我的实体 class Project ORM Id ORM Column type integer ORM G
  • 图书馆项目是否合并清单文件?

    我正在考虑创建一个核心应用程序库 一个包含所有逻辑的库项目 一个免费版本 和一个使用该库的完整版本 据我了解 清单中的某些内容不会合并 例如权限和活动 版本代码是否合并 我可以在库中放置一个版本代码来同时应用于免费和付费版本吗 第二个问题是
  • 如何在 Shiny 中更改输入后保留滚动位置

    在 Shiny 中 我使用带有大量项目的水平 radioGroupButtons 输入 如果单击其中一项 按钮标签的颜色会发生变化 这实际上很好用 但是 如果我单击最后一项 以便滚动到最右侧 则滚动位置将重置 因此 每次单击后 如果我想继续
  • Hibernate 将重复项插入到 @OneToMany 集合中

    我有一个关于 Hibernate 3 6 7 和 JPA 2 0 的问题 考虑以下实体 为简洁起见 省略了一些 getter 和 setter Entity public class Parent Id GeneratedValue pri