JPA Hibernate: объект, помеченный как грязный при использовании обрезки для удаления конечных пробелов

Вопрос:

Было отмечено, что Hibernate отмечает, что объект является грязным, когда в значении базы данных есть конечные пробелы, а trim() используется в getter/setter.

Наше приложение использует Spring Data JPA (1.6.1.RELEASE) и Hibernate (4.3.0.Final).

//getter method -- CUSTOMER_ID column values have trailing spaces in DB
@Column(name = "CUSTOMER_ID", nullable = false)
public String getCustomerId() {
return this.customerId == null ? null : this.customerId.trim();
}
//setter method
public void setCustomerId(String customerId) {
if(customerId!=null){
customerId = customerId.trim();
}
this.customerId = customerId;
}

Я сделал debuggind и понял, что во время процесса очистки Hibernate проверяет, есть ли какие-либо изменения в объекте, использующие org.hibernate.event.interna.DefaultFlushEntityEventListener.dirtyCheck(final FlushEntityEvent event) – он имеет логику, которая сравнивает начальные значения (loadState) с текущие (значения).

protected void dirtyCheck(final FlushEntityEvent event) throws HibernateException {
final Object[] values = event.getPropertyValues();
..
final Object[] loadedState = entry.getLoadedState();
..
..

if ( !cannotDirtyCheck ) {
// dirty check against the usual snapshot of the entity
dirtyProperties = persister.findDirty( values, loadedState, entity, session );
}
..
..

}

Таким образом, проблема заключается в том, что loadState имеет значения, считанные из resultSet as is (с конечными пробелами, метод setter не используется), где, когда значения подготовлены с использованием метода getter – это приводит к тому, что объект помечен как грязный и запускает нежелательные Запросы UPDATE.

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

Лучший ответ:

Это просто: объект изменился (с точки зрения спящего режима), и он обновляется в базе данных.

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

Оцените статью
TechArks.Ru
Добавить комментарий