【问题标题】:Using REQUIRES_NEW JTA transaction type in MyBatis on Wildfly在 Wildfly 上的 MyBatis 中使用 REQUIRES_NEW JTA 事务类型
【发布时间】:2016-09-10 05:22:55
【问题描述】:

我正在尝试在 Wildfly 中使用 mybatis-cdi,我需要在单独的事务中运行部分方法 - 请参阅以下 sn-p:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ItemService {

    @Inject
    @Mapper
    ItemMapper mapper;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void doSomething() {
        List<Item> items = mapper.findByTime(new Date());
        for(Item i : items) {
            update(i);
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void update(Item item) {
        mapper.updateSomehow(item);
    }
}

这是正确的方法吗? mybatis-cdi 是否支持这一点,还是应该以不同的方式完成?

【问题讨论】:

    标签: java cdi wildfly mybatis jta


    【解决方案1】:

    在方法中使用自引用时不会应用拦截器,因此您没有得到预期的行为,例如doSomething() 如何直接调用update()。您需要在单独的 bean 中进行此操作以允许单独的事务交互。

    【讨论】:

    【解决方案2】:

    您可以将 EJB 注入到自身中,以便通过代理调用它:

    @Stateless
    @TransactionManagement(TransactionManagementType.CONTAINER)
    class ItemService {
    
        @Inject
        @Mapper
        private ItemMapper mapper;
    
        @Inject // or @EJB
        private ItemService itemService;
    
        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public void doSomething() {
            List<Item> items = mapper.findByTime(new Date());
            for (Item i : items) {
                itemService.update(i); // here's the trick
            }
        }
    
        @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
        public void update(Item item) {
            mapper.updateSomehow(item);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-20
      • 2017-12-17
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多