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

TransactionalDataManager особенно полезен при обработке события EntityChangedEvent в текущей транзакции. Он позволяет получить текущее состояние измененной сущности из базы данных до коммита транзакции.