|
|
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
Есть @Service. Он помечен @Transactional. в @PostConstruct вызывают метод этого класса, который в свою очередь вызывает метод дао. Дао метод не помечен @Transactional. вываливается эксепшн авторHibernateException: Could not obtain transaction-synchronized Session for current thread Выяснилось, что проблема в том, что если я напрямую вызываю методе через this внутри @PostConstruct, то он напрямую и вызывается, а не через прокси, соответственно никакая транзакция не стартует. Какие варианты я вижу -Если пометить дао аннотацией @Transactional, то всё начинает работать, но мне кажется это как-то некрасивым. -Также есть вариант в @PostConstruct делать context.getBean. Имхо это говнокод потому, что мой бизнесс бин зависит от контекста. -Ну или переходить на написание программного управления транзакциями(не декларативного) Чего т мне все варианты не нравятся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 15:56 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
questioner, час не мог найти. Как сюда написал - сразу загуглил http://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the-method-within-the-same-class-does-not-wo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 16:00 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
questioner, Да, это актуальная проблема из без @PostConstruct - во всех случаях когда хочется вызвать свой собственный метод через проксю. И Service Locator здесь по-моему единственное простое решение. А если говорить именно про @PostConstruct, то вот. http://stackoverflow.com/a/18790494 Сама по себе идея запуска транзакции из PostConstruct попахивает неожиданными фейлами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 16:18 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Говорят, что если использовать Aspectj в качестве прокси повара, то должно работать. пробую настроить, но чот пока не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 17:00 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
questioner, Да, если вместо прокси-обертки заинжекстить перехват методов именно в байт-код этих методов, то да. Должно работать. Но для этого нужна инструментация байт-кода. Через агент, load time weaving или пост-компиляцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 17:11 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Хочу понять, что происходит) допустим у нас используется Dynamic Proxy это значит, что в рантайме создастся класс, который будет оборачивать наш объект и соответствовать всем его интерфейсам. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. this внутри метода m1 создастся класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. @PostConstruct повешен именно на наш класс а не на проксю. У прокси метадаты этой даже не будет. значит вызывается этот метод на оригинальном бине, поэтому никакого AOP для @Transactional не будет. а с инструментацией как будет? почему будет работать? CGLib например. он же через наследование работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 21:02 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 22:53 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
rdm, Можно вообще самого в себя заавтоварить и тоже будет работать. Я не решаю проблему, я хочу понять как работает спринг) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2015, 14:01 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
questionerBlazkowicz, Хочу понять, что происходит) допустим у нас используется Dynamic Proxy это значит, что в рантайме создастся класс, который будет оборачивать наш объект и соответствовать всем его интерфейсам. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. this внутри метода m1 создастся класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. @PostConstruct повешен именно на наш класс а не на проксю. У прокси метадаты этой даже не будет. значит вызывается этот метод на оригинальном бине, поэтому никакого AOP для @Transactional не будет. а с инструментацией как будет? почему будет работать? CGLib например. он же через наследование работает. небольшая ремарка: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2015, 14:07 |
|
||
|
Как транзакционно вызвать один метод из другого в рамках одного и того же класса?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestioner, Да, если вместо прокси-обертки заинжекстить перехват методов именно в байт-код этих методов, то да. Должно работать. Но для этого нужна инструментация байт-кода. Через агент, load time weaving или пост-компиляцию. попробовал написать над классом Код: java 1. Это вроде как форсит использовать CGLIB. но результат старый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2015, 14:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39098667&tid=2124678]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 433ms |

| 0 / 0 |
