|
|
|
EclipseLink + Spring @Transactional
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Возникла нужда в имеющемся Spring-boot приложении мигировать от Hibernate на EclipseLink. В процессе миграции обнаружилась странная особенность. Если метод помечен как @org.springframework.transaction.annotation.Transactional, то ВНУТРИ МЕТОДА при сохранении нового entity репозиторий возвращает неизмененный объект (entity.id == null). Если на методе нет аннотации @Transactional и/или транзакция стартует "мануально", то все ок, entity.id содержит значение первичного ключа. Такое поведение началось только после миграции на EclipseLink. Тут ошибка: Код: java 1. 2. 3. 4. 5. 6. транзакция запускается явно, все Ок: Код: java 1. 2. 3. 4. 5. 6. Нет @Transactional, тоже все Ок: Код: java 1. 2. 3. 4. Конфигурация: Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Репозиторий: Код: java 1. 2. Как можно исправить поведение @Transactional? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2016, 13:05 |
|
||
|
EclipseLink + Spring @Transactional
|
|||
|---|---|---|---|
|
#18+
В принципе, поведение объяснимое. Интересно было бы разобраться почему в Hibernate работало. В ручном управлении транзакцией есть подозрение, что эта транзакция просто не распространяется на репозиторий, и получается то же самое что и при отсутствии @Transactional. То есть в этих двух случаях репозиторий делает коммит. В случае же с открытой транзакцией ни flush ни коммит не происходит. Возможно, в Hibernate на этот случай есть костыль, чтобы гарантировать наличие id, он такие делает flush. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2016, 13:22 |
|
||
|
EclipseLink + Spring @Transactional
|
|||
|---|---|---|---|
|
#18+
SergWF, Вот тут ещё приведены настройки EclipseLink по делу http://stackoverflow.com/a/19846340 Есть смысл попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2016, 13:23 |
|
||
|
EclipseLink + Spring @Transactional
|
|||
|---|---|---|---|
|
#18+
Для получения Id нет необходимости коммитить данные. Но записать данные в БД JPA вполне может. Что Hibernate и делает. Похоже EclipseLink персистит объекты как-то иначе. Надеюсь, что существует возможность изменить это поведение конфигурацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2016, 13:30 |
|
||
|
EclipseLink + Spring @Transactional
|
|||
|---|---|---|---|
|
#18+
SergWFДля получения Id нет необходимости коммитить данные. Речь не о коммите. Для коммита требуется flush. И для генерации Id требуется flush. Поэтому там где был коммит, на уровне репозитория, там был и flush. А там где не было коммита, не было и flush и id null-овый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2016, 14:10 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39253643&tid=2123988]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 341ms |

| 0 / 0 |
