Java 使用QueryHints.BATCH时重复插入
我正在开发一个Java桌面应用程序(SE,JDK1.6.0),使用Swing GUI,通过EclipseLink 2.3.0直接连接到远程MySQL服务器(5.0) 出现问题的应用程序如下所示:用户搜索公司(例如位于X的所有公司),结果加载到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
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。我将尝试生成一个最小化的可编译示例,以再现错误,从而为您提供代码。