Двойные вставки при использовании QueryHints.BATCH - PullRequest
0 голосов
/ 09 ноября 2011

Я разрабатываю настольное 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), содержащий
    1. companyId
    2. personId
    3. relationTypeId
  • проблема не возникает при использовании только с query.setHint(​QueryHints.LEFT_FETCH)
  • Исправление: проблема возникает при пакетной выборке любого объекта с использованием QueryHints.BATCH независимо от типа ключа

1 Ответ

0 голосов
/ 09 ноября 2011

Вы отсоединяете объекты, смешиваете объекты из разных запросов / менеджеров транзакций / сущностей, используете ли вы слияние?

Происходит ли вставка без использования пакетной выборки?

Как называется идентификаторобъект и отношения сопоставлены?

...