Hibernate проблема метода saveorUpdate - PullRequest
3 голосов
/ 09 января 2011

Я пытаюсь работать с Hibernate (сторона базы данных в первый раз) и кое-как ударил в выборе наилучшего возможного способа использования saveOrUpdate или Save.Update. у меня есть класс POJO назначения и его другие атрибуты, которые необходимо обновить вместе с объектом назначения. я получаю файл XML для импорта и использую следующий код для обновления / сохранения целевого объекта вместе с его классами атрибутов.

try{
        getSessionFactory().getCurrentSession().beginTransaction();
        getSessionFactory().getCurrentSession().saveOrUpdate(entity);
        getSessionFactory().getCurrentSession().getTransaction().commit();
        }
        catch(Exception e){
            getSessionFactory().getCurrentSession().getTransaction().rollback();
        }
        finally{
            getSessionFactory().close();
        }

все работает нормально, пока я не использую тот же экземпляр сеанса. Но позже, когда я использую тот же XML-файл для обновления целевого PO для определенных атрибутов, это дает мне следующую ошибку.

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID'
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)

Я использую UUID в качестве первичного ключа для таблицы назначения, а в таблице назначения у меня есть уникальный идентификатор назначения. Но я могу понять, что в случае с secodn hibernate не может найти, если уже есть запись для тот же пункт назначения в БД и пытающийся выполнить оператор вставки вместо обновления.

одним из возможных решений является то, что я могу использовать пользователя destinationid, чтобы проверить, существует ли уже место назначения с заданным идентификатором и на основании результатов я могу выполнить команду сохранения или обновления. мой вопрос, это может быть достигнуто любым другим хорошим способом ..?

Заранее спасибо

1 Ответ

2 голосов
/ 09 января 2011

Семантика операции saveOrUpdate() следующая (см. 11.7. Автоматическое определение состояния ):

  • , если объект уже сохраняется в этом сеансе, выполнитеничто
  • если другой объект, связанный с сеансом, имеет такой же идентификатор, выведите исключение
  • , если у объекта нет свойства идентификатора, сохраните () его
  • , если идентификатор объектаимеет значение, присвоенное вновь созданному объекту, save () it
  • , если объект версионирован с помощью или, и значение свойства version является тем же значением, присвоенным недавно созданному объекту, save () it
  • в противном случае обновите () объект

Итак, похоже, что первичный ключ или значение версии потеряно при импорте файла XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...