guice - @Transactional - не работает

Я использую guice 4.1 вместе с расширением persist и надеюсь, что @Transactional будет работать, но это не так. Я следил за вики и прочитал этот пост, но безрезультатно:

Управление транзакциями в JavaSE с помощью Hibernate и Guice

Просто чтобы повторить... Я делаю:

  1. в зависимости от настойчивости
  2. используя аннотацию Google @Transactional
  3. использование аннотации только для общедоступных или защищенных методов, которыми управляет guice
  4. запуск PersistService...

person Walter    schedule 19.05.2017    source источник
comment
Пробовал решения на SO, но в итоге управлял им явно: entityManager.getTransaction().begin(); entityManager.persist(сущность); entityManager.getTransaction().commit();   -  person Justinas Jakavonis    schedule 23.05.2017


Ответы (1)


Мы столкнулись с чем-то подобным при обновлении наших библиотек в нашем текущем Sprint. Все наши неудачные модульные тесты были связаны с классами, которые мы внедряли, но не были привязаны к модулю.

(Что не было проблемой при использовании Guice 4.0).

Мы склонны привязывать наши классы только в том случае, если мы привязываемся к интерфейсу или какому-то специальному требованию. Поэтому, если бы у нас был простой класс с конструктором без аргументов или с аннотацией @Inject, мы бы не связывали его в модуле.

public class AA {

    public AA() {

    }

    @Transactional
    public void test() {
        System.out.println("" + getClass().getName());
    }
}

Если бы был введен класс AA, вызов test() вывел бы

package.test.AA$$EnhancerByGuice$$e2d19b62

После обновления до Guice 4.1 вывод

package.test.AA

Добавление следующего в модуль изменяет инъекцию обратно на прокси. Вот как @Transactional работает с использованием АОП

bind(AA.class);
person WarrenB SA    schedule 15.08.2017
comment
Спасибо, я тоже сегодня наткнулся на это. Вероятно, это лучшая практика для подражания. - person Walter; 16.08.2017