使用QueryHints.BATCH时重复插入

时间:2011-11-09 10:48:09

标签: java jpa eclipselink

我正在开发一个Java桌面应用程序(SE,JDK 1.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();

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

当我在jTable1中选择company1并且所有相关人员都显示在table2中时,会发出INSERT查询,尝试将显示的person2CompanyRelation实体再次插入到DB中,从而导致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批量抓取任何对象时,无论密钥类型是什么,都会出现问题

1 个答案:

答案 0 :(得分:0)

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

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

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