Всегда ли сервисный уровень должен быть транзакционным весной? - PullRequest
0 голосов
/ 09 мая 2019

У меня очень простое приложение весной, включая 1 класс модели для таблицы БД, 1 jpa репозиторий класса 1, сервис и 1 класс контроллера.

Мой класс обслуживания:

@Transactional
@Service
public class SomeService {

    private ServiceRepository serviceRepository;

    @Autowired
    public serviceService(ServiceRepository serviceRepository) {
        this.serviceRepository = serviceRepository;
    }


    public void getServiceById(Long id) {
        Model model = serviceRepository.getOne(id);
        return....
    }

}

Работает с аннотацией @Transactional. Но если я удалю это, я получу

org.hibernate.LazyInitializationException: не удалось инициализировать прокси

Что если я не хочу какой-либо транзакционный метод или класс, почему я должен сделать его транзакционным?

1 Ответ

3 голосов
/ 09 мая 2019

Это исключение происходит, потому что вы пытаетесь получить доступ к объектам, которые не были загружены внутри вашей транзакции.

Когда вы выходите из транзакции, вы больше не можете загружать объекты из базы данных.Но транзакция не является обязательной.

Я думаю, что у вас есть объекты с отношением OneToMany / ManyToMany, которое является lazyLoaded.Поскольку ваш сервис не транзакционный, соединение с БД закрыто, и вы больше не можете получить доступ к объектам.

У вас есть 2 варианта:

  • Установить Eager fetch для ваших объектов(ваши объекты всегда загружаются).
  • Сделайте ваш сервис транзакционным (объекты будут загружаться по требованию).

При активации отложенной загрузки вы должны знать о проблемах производительности (опция по умолчанию).Это действительно зависит от вашей бизнес-логики, важно ли ее использовать или нет, но лучше попытаться не иметь множественный доступ к БД.

Вы также можете обратиться к Entity Graph для расширенных настроек: https://www.baeldung.com/jpa-entity-graph

Кроме того, при разработке разрешите трассировку SQL в спящем режиме, чтобы увидеть, что происходит в фоновом режиме: https://www.mkyong.com/hibernate/hibernate-display-generated-sql-to-console-show_sql-format_sql-and-use_sql_comments/

...