Spring Hibernate @ Транзакционные разъяснения - PullRequest
0 голосов
/ 17 февраля 2019

У меня возникла путаница с аннотацией @Transactional.

1) Если я использую только декларативный подход, достаточно ли пометить мой класс / методы обслуживания как @Transactional, или я должен создать компоненты конфигурации и свойства, как показано в этой статье Baeldung ?

2) Мне нужно использовать даже программный подход в некоторых ситуациях, чтобы иметь возможность явно вызывать flush () в определенной точке моего рабочего процесса.В этом случае прежние определения hibernate-конфигов являются обязательными?

1 Ответ

0 голосов
/ 17 февраля 2019

Если вы работаете над проектом Spring Boot, нет, вам не нужно явно объявлять Beans SessionFactory или PlatformTransactionManager.Они будут автоматически настроены для вас.

Да, для выполнения транзакций достаточно добавить аннотацию Transactional в ваш класс или метод.Автоматическую фиксацию даже следует отключить автоматически (в целях оптимизации), если это не сделано на уровне DataSource.

Для «программной» части следует рассмотреть возможность остаться на стороне аннотации.Вы можете поиграть со стратегиями распространения транзакций , чтобы изолировать определенные операции.


Несколько важных замечаний об использовании декларативного подхода с аннотациями.

Не забывайте комментировать методы public, если это возможно.Видимость любого другого метода не может управляться через прокси-серверы Java или прокси-серверы CGLIB, поэтому, даже если вы этого не заметите, эти методы не будут участвовать в контексте транзакции.Для методов protected или private вы вынуждены использовать AspectJ.

Помните также, что при использовании прокси самовывоз (и ожидание новой транзакции) не работает.


Чтобы использовать программный подход, вам просто нужно Autowire TransactionTemplate или PlatformTransactionManager Bean.

PlatformTransactionManager допускает дополнительную настройку транзакции, в то время как TransactionTemplateэто скорее служебный объект (который, однако, может быть смоделирован по мере необходимости).

Очевидно, не смешивайте оба подхода в одном и том же стеке вызовов методов.

...