Java 使用QueryHints.BATCH时重复插入

Java 使用QueryHints.BATCH时重复插入,java,jpa,eclipselink,Java,Jpa,Eclipselink,我正在开发一个Java桌面应用程序(SE,JDK1.6.0),使用Swing GUI,通过EclipseLink 2.3.0直接连接到远程MySQL服务器(5.0) 出现问题的应用程序如下所示:用户搜索公司(例如位于X的所有公司),结果加载到JTable。当用户选择一家公司时,会显示来自其他相关表格的大量附加数据(例如,关于该公司、员工、员工电话号码等的注释),其中大多数是@OneToMany关系 由于每个条目需要大量的数据和表格,我必须优化搜索查询,以使用联接和批量获取: import org

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

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

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

import org.eclipse.persistence.config.QueryHints; import javax.persistence.Query; 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"); List list = query.getResultList(); 导入org.eclipse.persistence.config.QueryHints; 导入javax.persistence.Query; Query Query=entityManager.createQuery(“从c公司中选择不同的c,其中c.y=x”); setHint(QueryHints.LEFT_FETCH,“c.companyWebsiteCollection”); query.setHint(​QueryHints.BATCH,“c.person2companyRelationCollection”); List=query.getResultList(); 问题出现在
person2companyRelationCollection
中,该公司与与其他公司有关系的人有关系,而其他公司与其他人和公司等有关系

当我在jTable1中选择company1,所有相关人员显示在表2中时,会发出一个INSERT查询,试图将显示的
person2CompanyRelation
实体再次插入数据库,导致出现
om.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:重复条目

我的查询提示有什么问题

其他信息

  • 我不分离任何对象
  • 我不合并任何对象
  • 所有实体均由相同的
    EntityManager
  • 所有操作都在同一事务中完成
  • Person2companyRelation的主键是一个复合主键(
    @EmbeddedId
    ),包含
  • companyId
  • personId
  • relationTypeId
  • 仅与
    query.setHint一起使用时不会出现此问题(​QueryHints.LEFT_FETCH)

  • 更正:当使用
    查询提示批量获取任何对象时,该问题确实会发生。批处理
    ,无论键类型如何
是否分离对象、混合来自不同查询/事务/实体管理器的对象,是否使用合并

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


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

我已经为这个问题添加了更多信息。谢谢你的帮助。我试图重现这个问题,但没有成功。它可能与复合主键有关,您可以尝试批量获取其他关系吗。请包括类和查询的代码,事务提交代码。您是否可以从查询中删除JOIN\u FETCH,在同一查询中同时使用JOIN_FETCH和BATCH可能会出现问题。我已从查询中删除了所有联接,但没有任何帮助。您可能是对的:问题似乎与复合主键有关,但此时我无法重新构造DB。我将尝试生成一个最小化的可编译示例,以再现错误,从而为您提供代码。