2016-02-15 2 views
1

При использовании аннотации @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, этот (грязный объект) не происходит.

Это обычное поведение или ошибка в спящем режиме.

+0

Можете вы добавить код для 'Model' тоже? Я предполагаю, что вы не переопределили метод 'findById' в репозитории весны. Можете ли вы это подтвердить? – Augusto

+0

Я удалил класс модели. У него просто был сформированный идентификатор строки. Теперь я добавил id в существующий класс. У меня есть метод SampleTable findById (String id); в интерфейсе SampleTableRepository, который я создал. – Arun

+0

Я думаю, что это проблема только для чтения: см. [Здесь] (http://stackoverflow.com/questions/13539213/why-do-i-need-transaction-in-hibernate-for-read-only-operation) – hasnae

ответ

0

Есть много complicated configuration options для транзакций весной. Стоит добавить @ReadOnly к транзакциям, которые вы уверены, действительно доступны только для чтения.

0

Hibernate применяет стратегию (осмотр) для обнаружения грязных объектов (например, если объект все еще преходящ, то он всегда грязный.). Поэтому, чтобы избежать грязной проверки, используйте примечание readonly (точка 5. из post: Другое дело, когда дело доходит до Hibernate, Spring устанавливает FlushMode в MANUAL в случае транзакций только для чтения, что приводит к другим оптимизациям, таким как отсутствие необходимости в грязных чеки.)

+0

Информация полезна. Но, мой фактический вопрос, почему объект грязный, когда он не изменен методом. – Arun

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