2015-01-31 4 views
1

В уровне услуг, мы получилиКак исключить метод @Transactional?

@Service 
@Transactional(readOnly = false) 
public abstract class GenericService 

В слое хранилища, мы получили

public abstract class GenericRepository 

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

@Override 
    public void savePersist(T entity) { 

     getSession().persist(entity); 
    } 

Все, что я хочу сделать, это сохранить объект «сущность» в сеанс спящего режима для дальнейшей обработки без фиксации или любой инструкции вставки в базу данных. , но на самом деле происходит сохранение «сущности» после запуска savePersist(). Я думаю, это из-за использования аннотации @Transactional для класса обслуживания. Но что мне делать для сохранения объекта в сеансе?

+0

ли это желаемое поведение для всех ситуаций или просто для конкретного случая? В любом случае метод '' savePersist (T entity) '' 'предназначен для сохранения и фиксации изменений, поэтому, если вам нужно поведение, отличное от этого, для конкретной ситуации, лучше искать другие решения. Например, у вас может быть какая-то прокси-служба с '' 'readOnly = true''', которая вызовет' '' GenericRepository.savePersist (T entity) '' ', в результате весна будет нести прокси и не создаст новую транзакцию , поэтому предприятие не будет совершено. – vtor

ответ

2

Когда вы просто хотите, чтобы Spring не совершала транзакцию, вам необходимо выполнить роль транзакции. Есть несколько способов:

  • бросание время выполнения Exception (в пределах метода, который имеет @Transactional аннотацию) - но это немного злоупотребляет механизм roleback
  • другой способ является, чтобы отметить транзакции, как readOnly: @Transactional(readOnly = true)

Но это оба работает только для полной сессии!

Другой способ, чтобы сделать объект только для чтения: https://docs.jboss.org/hibernate/orm/3.5/reference/de-DE/html/readonly.html#readonly-api

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