powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
11 сообщений из 11, страница 1 из 1
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39098582
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть @Service. Он помечен @Transactional.

в @PostConstruct вызывают метод этого класса, который в свою очередь вызывает метод дао. Дао метод не помечен @Transactional.

вываливается эксепшн авторHibernateException: Could not obtain transaction-synchronized Session for current thread
Выяснилось, что проблема в том, что если я напрямую вызываю методе через this внутри @PostConstruct, то он напрямую и вызывается, а не через прокси, соответственно никакая транзакция не стартует.

Какие варианты я вижу
-Если пометить дао аннотацией @Transactional, то всё начинает работать, но мне кажется это как-то некрасивым.
-Также есть вариант в @PostConstruct делать context.getBean. Имхо это говнокод потому, что мой бизнесс бин зависит от контекста.
-Ну или переходить на написание программного управления транзакциями(не декларативного)

Чего т мне все варианты не нравятся
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39098589
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,

час не мог найти.
Как сюда написал - сразу загуглил

http://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the-method-within-the-same-class-does-not-wo
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39098609
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Да, это актуальная проблема из без @PostConstruct - во всех случаях когда хочется вызвать свой собственный метод через проксю.
И Service Locator здесь по-моему единственное простое решение.

А если говорить именно про @PostConstruct, то вот.
http://stackoverflow.com/a/18790494

Сама по себе идея запуска транзакции из PostConstruct попахивает неожиданными фейлами.
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39098661
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Говорят, что если использовать Aspectj в качестве прокси повара, то должно работать.

пробую настроить, но чот пока не получается
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39098667
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Да, если вместо прокси-обертки заинжекстить перехват методов именно в байт-код этих методов, то да. Должно работать. Но для этого нужна инструментация байт-кода. Через агент, load time weaving или пост-компиляцию.
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102376
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Хочу понять, что происходит)

допустим у нас используется Dynamic Proxy
это значит, что в рантайме создастся класс, который будет оборачивать наш объект и соответствовать всем его интерфейсам.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class MyClass implements Int1{
          @Override   
          public void m1(){
              ...
              m2();
              ...
          }
          @Override   
          public void m2(){...}
}



this внутри метода m1

создастся класс

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class MyClassProxy implements Int1{
          
          @Autowired
          private MyClass myClass;
          
          @Override   
          public void m1(){
              myClass.m1()
          }
          
          @Override   
          public void m2(){
              myClass.m2()
          }
}



@PostConstruct повешен именно на наш класс а не на проксю. У прокси метадаты этой даже не будет. значит вызывается этот метод на оригинальном бине, поэтому никакого AOP для @Transactional не будет.


а с инструментацией как будет? почему будет работать?

CGLib например.

он же через наследование работает.
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102447
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, у Вас же какая-то инициализация происходит в @PostConstruct? Можно было перенести логику из этого метода в метод типа init() и вызвать его из другого сервис бина в методе @PostConstruct?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class AdminService {


@PostConstruct
void initMySystem{

//вызов всех Init методов для нужны бинов
serviceBean1.init();
serviceBean2.init();
serviceBean3.init();
}



void systemOn() {

}

void systemOff() {

}


}
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102928
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdm,

Можно вообще самого в себя заавтоварить и тоже будет работать.

Я не решаю проблему, я хочу понять как работает спринг)
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102937
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questionerBlazkowicz,

Хочу понять, что происходит)

допустим у нас используется Dynamic Proxy
это значит, что в рантайме создастся класс, который будет оборачивать наш объект и соответствовать всем его интерфейсам.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class MyClass implements Int1{
          @Override   
          public void m1(){
              ...
              m2();
              ...
          }
          @Override   
          public void m2(){...}
}





this внутри метода m1

создастся класс

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class MyClassProxy implements Int1{
          
          @Autowired
          private MyClass myClass;
          
          @Override   
          public void m1(){
              myClass.m1()
          }
          
          @Override   
          public void m2(){
              myClass.m2()
          }
}



@PostConstruct повешен именно на наш класс а не на проксю. У прокси метадаты этой даже не будет. значит вызывается этот метод на оригинальном бине, поэтому никакого AOP для @Transactional не будет.


а с инструментацией как будет? почему будет работать?

CGLib например.

он же через наследование работает.

небольшая ремарка:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Transactional
class MyClass implements Int1{
          @PostConstruct
          @Override   
          public void m1(){
              ...
              m2();
              ...
          }
          @Override   
          public void m2(){...}
}
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102974
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestioner,

Да, если вместо прокси-обертки заинжекстить перехват методов именно в байт-код этих методов, то да. Должно работать. Но для этого нужна инструментация байт-кода. Через агент, load time weaving или пост-компиляцию.

попробовал написать над классом

Код: java
1.
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)



Это вроде как форсит использовать CGLIB.
но результат старый
...
Рейтинг: 0 / 0
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
    #39102985
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, похвально
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]