При использовании аннотации @Transactional
в методе, и мы не изменяем объект домена, но фиксируется новая ссылка на новый объект.@Transactional создает новый ссылочный грязный объект, даже если он не изменен.
Например давайте возьмем случай пример:
домена объекта:
@Table(name = "SAMPLE_TABLE")
public class SampleTable{
@Column(name = "ID")
String id;
@Column(name = "FIRST_NAME")
String firstName;
@Column(name = "CITY")
String city;
@Column(name = "STREET_ADDRESS")
private String streetAddress;
}
И у меня есть метод обслуживания с @Transactional
аннотацию, но не изменяет объект домена.
@Transactional
public void doNothing(String id) {
SampleTable sampleTable = sampleTableRepository.findById(id);
}
Таким образом, всякий раз, когда doNothing
метода выполняется, я вижу объект домена становится грязным, так как новый эталонным без изменения данных совершаются. (Подтвержден это с помощью Hibernate Перехват findDirty
метода). Когда я удаляю @Transactional
, этот (грязный объект) не происходит.
Это обычное поведение или ошибка в спящем режиме.
Можете вы добавить код для 'Model' тоже? Я предполагаю, что вы не переопределили метод 'findById' в репозитории весны. Можете ли вы это подтвердить? – Augusto
Я удалил класс модели. У него просто был сформированный идентификатор строки. Теперь я добавил id в существующий класс. У меня есть метод SampleTable findById (String id); в интерфейсе SampleTableRepository, который я создал. – Arun
Я думаю, что это проблема только для чтения: см. [Здесь] (http://stackoverflow.com/questions/13539213/why-do-i-need-transaction-in-hibernate-for-read-only-operation) – hasnae