2016-05-13 6 views
1

Я пытаюсь использовать mybatis-КДИ в течение Wildfly и мне нужно запустить часть метода в отдельной транзакции - см следующий фрагмент кода:Использование REQUIRES_NEW JTA тип транзакции в MyBatis на Wildfly

@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, или это должно быть сделано по-другому?

ответ

1

Вы не получаете ожидаемого поведения, поскольку перехватчики не применяются при использовании самонаведения в методе, например, как doSomething() звонит update() напрямую. Вам нужно, чтобы это происходило в отдельном компоненте, чтобы обеспечить отдельное взаимодействие транзакций.

+0

Спасибо, нашел его между мною: https://github.com/dlee0113/java_ee_patterns_and_best_practices/blob/master /SelfInvokingEJB/src/java/com/abien/patterns/business/selfinvocation/Hack.java – miran

0

Вы можете вводить свой 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); 
    } 
}