Я пытаюсь работать с 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, чтобы проверить, существует ли уже место назначения с заданным идентификатором и на основании результатов я могу выполнить команду сохранения или обновления.
мой вопрос, это может быть достигнуто любым другим хорошим способом ..?
Заранее спасибо