3.2.6.2.2. TransactionalDataManager

TransactionalDataManager 是一个中间层的 bean,跟 DataManager 接口类似,但是可以使用一个已经存在的事务。有如下功能:

  • 如果有活跃的事务,则会使用它,否则跟 DataManager 一样会创建并提交一个新事务。

  • 接收并返回游离态的实体。开发者需要使用合适的视图加载实体并使用 save() 方法显式的保存修改的实例至数据库。

  • 使用行级安全机制,使用跟 DataManager 一样的方式处理动态属性和跨数据存储引用。

下面是在 service 的方法中使用 TransactionalDataManager 的简单示例:

  1. @Inject
  2. private TransactionalDataManager txDataManager;
  3. @Transactional
  4. public void transfer(Id<Account, UUID> acc1Id, Id<Account, UUID> acc2Id, Long amount) {
  5. Account acc1 = txDataManager.load(acc1Id).one();
  6. Account acc2 = txDataManager.load(acc2Id).one();
  7. acc1.setBalance(acc1.getBalance() - amount);
  8. acc2.setBalance(acc2.getBalance() + amount);
  9. txDataManager.save(acc1);
  10. txDataManager.save(acc2);
  11. }

可以在框架测试代码中找到更复杂的例子: DataManagerTransactionalUsageTest.java

如果需要在当前事务中处理 EntityChangedEvent 事件的话,TransactionalDataManager 特别有用。可以在事务提交之前从数据库获取更改实体的当前状态。