2015-10-08 1 views
1

В основном я пытаюсь получить сущность, которая имеет отношение LAZY к другому объекту. Ниже приведены две вещи, которые я пробовал. Первый работает, второй - нет, и я не понимаю, почему. Все, что я хочу, - это получить сущность из базы данных. Причина, по которой я поместил это в другой метод, - это то, что я не хочу, чтобы первый был @Transactional, потому что это может занять некоторое время. Обратите внимание, что я не сохраняю или даже не обращаюсь к базе данных снова в первом методе, мне просто нужно прочитать из db один раз.

Метод 1 (работает, как ожидалось):Не может ленивый выбор - нет сеанса внутри @Transactional метод

@Override 
@Transactional 
public void sendEmailToUser(Long exhibitorId) { 
    EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);  
} 

private EmailExhibitorTO findExhibitorById(Long id){ 
    return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class); 
} 

Все здесь хорошо, я получаю сущность и ленивое инициализирован объект, а также.

Метод 2 (не работает):

@Override 
public void sendEmailToUser(Long exhibitorId) { 
    EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);  
} 

@Transactional 
private EmailExhibitorTO findExhibitorById(Long id){ 
    return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class); 

Это, однако, не работает. Ошибка: enter image description here
Существует исключение отображения, но это связано с тем, что ленивый объект не может быть извлечен.
Я, наверное, просто глуп, но если что-то я не понимаю, объясните.
Заранее спасибо.

ответ

3

@Transactional в вашем личном методе не влияет, потому что вы вызываете его из другого метода класса, минуя прокси-сервер, обрабатывающий транзакцию.

+0

Звучит разумно, не могли бы вы уточнить немного на эту тему? Есть ли обходной путь? – Sikor

+0

Вы можете найти объяснение [здесь] (http://stackoverflow.com/questions/32994544/spring-cacheable-not-caching/32999744#32999744) – Ruben

+0

Большое спасибо. – Sikor

0

вы не можете распространять операции на частных методов, вы можете увидеть его здесь: Does Spring @Transactional attribute work on a private method?

+0

Он не работает и для общественности, и для защиты. – Sikor

+0

В первом примере, который вы сказали, что работает, вы аннулировали публичный метод, а на втором вы сделали его на личном. @transactional работает только на общедоступных методах, частные и защищенные не будут работать, если у вас есть проблемы с общедоступными методами, бросающими исключение LazyInitializationException, вам нужно проверить объем сеанса, который вы используете. Можете ли вы отправить кусок кода, который бросает ошибку, если это так? –

+0

Проблема была именно в том, что сказал @Ruben, но большое спасибо за ваш интерес к этому вопросу. Понятно, что. – Sikor

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