Удаление объекта, но с использованием того же первичного ключа для добавления аналогичного объекта после удаления - PullRequest
1 голос
/ 01 сентября 2009

Я пытаюсь удалить объект, который имеет уникальный ПК, например: 80253

Я удаляю эту сущность, выполняя следующие строки кода:

myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
getEntityManager().flush();

Эти биты кода действительно удаляют строки из моей базы данных и всех ее каскадных объектов должным образом, и я очень рад этому. Теперь проблема возникает, когда мне нужно создать похожую сущность, которая использует тот же первичный ключ (который теперь должен быть в порядке?).

MyEntityType2 myEntityType2 = new MyEntityType2 ();
myEntityType2.copyData(myEntityType1); //access the data from the other object
//and retrieves the id 80253. myEntityType2 now has 80253 as ID.
getEntitymanager().persist(myEntityType2);

Теперь я получаю уникальную ошибку SQL ограничения. Я пытаюсь вставить идентификатор, который уже существует, и изменения автоматически откатываются (старая сущность больше не удаляется). Это происходит после того, как я вижу в своем логгере, что toplink удалил записи старого объекта.

Кто-нибудь знает, как это происходит, и почему это не работает? Для записи я попытался объединить, закрыть, очистить entityManager, но, похоже, ничего не работает.

Мне кажется, что JPA может плохо кэшировать или что-то в этом роде. Надеюсь, у меня есть хороший ответ для меня! =)

Обновление: Theres больше не проблема с ограничениями уникального идентификатора, но я создаю новый подкласс с тем же первичным ключом, который был удален, я получаю следующее исключение:

Exception Description: Trying to invoke [setApprovedWhen] on the object [null].  The 
number of actual and formal parameters differs, or an unwrapping conversion has failed.
Internal Exception: java.lang.IllegalArgumentException: object is not an instance of 
declaring class

Мне кажется, что это не позволит мне изменить объект на другой подкласс?

1 Ответ

2 голосов
/ 01 сентября 2009

EDIT: Попробуйте явно запустить и зафиксировать транзакцию.

Удалить сущность так же просто, как вызов метода EntityManager удалить (объект сущности) следующим образом пример показывает. Сущность, которую вы удаляете необходимо управлять: то есть был ранее прочитан в текущем постоянный контекст.

entityManager.getTransaction().begin();
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253);
getEntityManager().remove(myEntityType1);
entityManager.getTransaction().commit(); 

Когда транзакция завершена или Вы вызываете метод EntityManager flush (), объект будет удален. В контейнере, управляемом постоянством контекст транзакции границы будет контролироваться контейнером.

...