【问题标题】:Duplicate inserts when using QueryHints.BATCH使用 QueryHints.BATCH 时重复插入
【发布时间】:2011-11-09 10:48:09
【问题描述】:

我正在开发一个 Java 桌面应用程序(SE、JDK 1.6.0),使用 Swing GUI 通过 EclipseLink 2.3.0 直接连接到远程 MySQL 服务器 (5.0)。

出现我的问题的应用程序如下所示:用户搜索公司(例如位于 X 中的所有公司)并将结果加载到 JTable。当用户选择一家公司时,会显示来自其他相关表格的更多附加数据(例如关于公司、员工、员工电话号码等的注释),其中大部分是@OneToMany 关系。

由于每个条目需要大量的数据和表,我必须优化我的搜索查询以使用连接和批量提取:

导入 org.eclipse.persistence.config.QueryHints; 导入 javax.persistence.Query; 查询 query = entityManager.createQuery("SELECT DISTINCT c FROM Company c WHERE c.y = x"); query.setHint(QueryHints.LEFT_FETCH, "c.companyWebsiteCollection"); query.setHint(​QueryHints.BATCH, "c.person2companyRelationCollection"); 列表列表 = query.getResultList();

问题出现在person2companyRelationCollection,它与与其他公司有关系的人有关系,而这些人与其他人和公司等有联系。

当我在 jTable1 中选择 company1 并且所有相关人员都显示在 table2 中时,会发出一个 INSERT 查询,尝试将显示的person2CompanyRelation 实体再次插入数据库,从而导致om.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry

我的查询提示有什么问题?

其他信息

  • 我不分离任何对象
  • 我不合并任何对象
  • 所有实体都由同一个EntityManager管理
  • 所有都在同一个事务中完成
  • Person2companyRelation 的 PK 是一个复合主键 (@EmbeddedId),包含
    1. companyId
    2. personId
    3. relationTypeId
  • 仅与query.setHint(​QueryHints.LEFT_FETCH)一起使用时不会出现问题
  • 更正:使用QueryHints.BATCH 批量获取任何对象时确实会出现此问题,无论键类型如何

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

    您是否正在分离对象,混合来自不同查询/事务/实体管理器的对象,您是否使用合并?

    是否在不使用批量提取的情况下进行插入?

    对象的Id和关系是如何映射的?

    【讨论】:

    • 我在问题中添加了更多信息。感谢您提供帮助。
    • 我试图重新创建问题,但不能。可能跟复合主键有关系,能不能尝试批量抓取其他关系。请包括类代码和您的查询、事务提交代码。
    • 能否从查询中删除 JOIN_FETCH,在同一查询中同时使用 JOIN_FETCH 和 BATCH 可能会出现问题。
    • 我已从查询中删除了所有联接,但没有帮助。
    • 您可能是对的:这个问题似乎与 复合主键 相关——但此时我无法重组数据库。我将尝试生成一个最小化的可编译示例来重现错误,以便我可以给你代码。
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2016-10-22
    • 2017-02-03
    • 2023-03-10
    相关资源
    最近更新 更多