2013-12-19 2 views
1

Это вопрос Hibernate/JPA об обновлении объекта в базе данных.Слияние и слияние Hibernate не сохраняются в объекте

У меня есть объект, который я создал в другой транзакции, используя entityManager.persist (object).

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

В следующем коде rvalue имеет измененную информацию до тех пор, пока не будет вызвано обновление. После вызова refresh данные возвращаются к исходным значениям.

Я ожидаю, что вызов flush() будет сохраняться в базе данных.

Я попытался прокомментировать вызов обновления, считая, что сохранение не произойдет, пока я не покину метод, завернутый в транзакцию. Тем не менее, я все еще считаю, что изменения не сохраняются.

Любые идеи о том, что может произойти, будут очень признательны!

@Override 
public T merge(T object) { 
    T rvalue = entityManager.merge(object); 
    entityManager.flush(); 
    entityManager.refresh(rvalue); 
    return rvalue; 
} 

ответ

6

я понял, что проблема была. Оказывается, проблема не связана с параметрами entityManager или @Transaction. Это была Сущность. Одно из полей, которые я пытался обновить, было отмечено как updatable = false. Как только я нашел и изменил этот параметр, все было хорошо. Я привык видеть этот параметр в аннотации @Column на получателе, где он определен, но обнаружил, что он был переопределен аннотацией @AttributeOverride в производном классе.

Хотя это оказалось простой и неосложненной причиной и исправлением, путь к тому, чтобы попасть туда, имел свои проблемы. Во всем моем устранении неполадок (пошаговый код, включение журналов для Hibernate и Spring и т. Д.). У меня не было исключений из-за того, что обновление не удалось из-за этого ограничения.

+0

полезный ответ. Работаю отлично для меня !!! –

1

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

Источник is Here

Смежные вопросы