JPA: ошибка InvalidStateException + составной ключ / EmbeddableId / идентификаторы, сгенерированные последовательностью - PullRequest
0 голосов
/ 28 августа 2011

В настоящее время у меня настроена схема с моей базой данных и Java-приложением, использующим OpenJPA, который работает большую часть времени, но иногда я получаю сообщение об ошибке для нескольких пользователей:

org.apache.openjpa.persistence.InvalidStateException: попытка установить для столбца «table1.ID» два разных значения

table1 фактически имеет составной ключ (два значения), и каждое значение в этом ключе является внешним ключом для другой таблицы.Я использовал RSA (Rational Software Architect) для настройки сущностей для меня (сгенерированный код).Он установил класс PK (используя @EmbeddableId для ссылки на класс PK) в классе Entity для table1, а затем две связи @ManyToOne в том же классе Entity table1 (а также в классах сущностей, на которые ссылаются эти столбцы), поскольку онивнешние ключи

Теперь, как я упоминал выше, каждое значение в составном ключе является внешним ключом.Каждый из этих внешних ключей фактически генерируется с использованием внешнего секвенсора в своих собственных классах сущностей.Я использую DB2 и использую @GeneratedValue для столбцов (т. Е. Идентификаторы в классах сущностей table2 и table3).Я использую стратегии = GenerationType.SEQUENCE также для каждого.

Опять же, все работает ОБЫЧНО, но не в 100% случаев, и я не уверен, почему.Я избавился от этой ошибки, уничтожив все и перезагрузив Генераторы последовательностей, но я знаю, что это определенно не решение проблемы.Может ли это быть связано с тем фактом, что два значения составного ключа в базе данных являются внешними ключами столбцов, которые были созданы с использованием последовательности, но объект PK может не знать?

Я также заметил, что он работает только для пользователей, у которых есть запись в таблице Users (один из внешних ключей, упомянутых выше, относится к таблице Users, а другой FK - к другой таблице).Что происходит, если пользователя нет в таблице, он создает его, что-то вроде:

User newUser = userManager.getNewUser();
newUser.setName(..);
newUser.setEmail(..);
...

Когда это будет сделано, класс PK, о котором я упоминал выше, имеет новый экземпляр этого созданного, который затем называетсяв другой стол.Идентификатор от пользователя выше передается в ПК.Как:

PK newPK = pkManager.getNewPK();
newPk.setAID(newUser.getID());

Кто-нибудь сталкивался с этим?Любые решения?

1 Ответ

0 голосов
/ 29 августа 2011

Извините, исправил проблему. Я просмотрел свой код и понял, что забыл провести рефакторинг одной строки кода (изменение модели данных).

...