В настоящее время у меня настроена схема с моей базой данных и 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());
Кто-нибудь сталкивался с этим?Любые решения?