我正在开发一个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
@EmbeddedId
)包含
companyId
personId
relationTypeId
query.setHint(QueryHints.LEFT_FETCH)
QueryHints.BATCH
批量抓取任何对象时,无论密钥类型是什么,都会出现问题答案 0 :(得分:0)
您是否正在分离对象,混合来自不同查询/事务/实体管理器的对象,您使用的是合并吗?
是否在不使用批量提取的情况下进行插入?
如何映射对象的Id和关系?