【发布时间】: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),包含companyIdpersonIdrelationTypeId
- 仅与
query.setHint(QueryHints.LEFT_FETCH)一起使用时不会出现问题 -
更正:使用
QueryHints.BATCH批量获取任何对象时确实会出现此问题,无论键类型如何
【问题讨论】:
标签: java jpa eclipselink