Я разрабатываю настольное Java-приложение (SE, JDK 1.6.0), подключающееся напрямую к удаленному MySQL Server (5.0) через EclipseLink 2.3.0 с использованием графического интерфейса Swing.
Приложение, в котором возникает моя проблема, выглядит следующим образом: пользователь выполняет поиск компаний (например, все компании, расположенные в 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
, который поддерживает отношения с лицами, связанными с другими компаниями, связанными с другими лицами и компаниями и т. Д.
Когда я выбираю company1 в jTable1 и все связанные лица отображаются в таблице 2, выдается запрос INSERT, который пытается снова вставить показанную сущность person2CompanyRelation
в БД, вызывая om.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry
.
Что я делаю не так с подсказками к моему запросу?
Дополнительная информация :
- Я не отсоединяю никаких объектов
- Я не объединяю никакие объекты
- все объекты управляются одним и тем же
EntityManager
- все делается в рамках одной транзакции
- PK Person2companyRelation - это составной первичный ключ (
@EmbeddedId
), содержащий
companyId
personId
relationTypeId
- проблема не возникает при использовании только с
query.setHint(QueryHints.LEFT_FETCH)
- Исправление: проблема возникает при пакетной выборке любого объекта с использованием
QueryHints.BATCH
независимо от типа ключа