3.2.6.2.2. TransactionalDataManager
TransactionalDataManager
- это бин среднего слоя, который во многом повторяет интерфейс DataManager
, но при этом может присоединяться к существующей транзакции. Он имеет следуюшие особенности:
-
При наличии активной транзакции, выполняет действия в ее контексте, в противном случае стартует и коммитит новую транзакцию так же как
DataManager
. -
Принимает и возвращает сущности в состоянии detached. Разработчик должен загружать сущности с необходимыми представлениями и явно вызывать метод
save()
для сохранения измененных экземпляров в БД. -
Применяет ограничения row-level security, работает с динамическими атрибутами и ссылками между хранилищами так же как
DataManager
.
Ниже приведен простейший пример использования TransactionalDataManager
в некотором методе сервиса:
@Inject
private TransactionalDataManager txDataManager;
@Transactional
public void transfer(Id<Account, UUID> acc1Id, Id<Account, UUID> acc2Id, Long amount) {
Account acc1 = txDataManager.load(acc1Id).one();
Account acc2 = txDataManager.load(acc2Id).one();
acc1.setBalance(acc1.getBalance() - amount);
acc2.setBalance(acc2.getBalance() + amount);
txDataManager.save(acc1);
txDataManager.save(acc2);
}
Более сложный пример можно найти в тесте фреймворка: DataManagerTransactionalUsageTest.java
|