Аннотированный класс @transactional, завернутый в прокси, но транзакция не создаетсяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Аннотированный класс @transactional, завернутый в прокси, но транзакция не создается

Сообщение Anonymous »

Ну... Пытался найти в гугле и здесь, но безуспешно. Вот моя история:
  • ВЫПУСК Spring MVC 3.1.1
  • ВЫПУСК Spring Data JPA 1.1.0
  • Hibernate 3.6.9.Final
Проблема: у меня есть метод save(...) с Аннотация @Transactional(propagation=Propagation.REQUIRES_NEW). Но транзакция не создается.

Другие выводы:
1) Когда я аннотирую метод @Transactional из другой службы, транзакция создается.

Код: Выделить всё

21:49:13.397 [DEBUG] (http-8080-2) org.springframework.orm.jpa.JpaTransactionManager  - Creating new transaction with name [com.xen.components.page.PageServiceImpl.findAllOrdered]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2) Служба, в которой находится этот метод, обернута прокси-сервером (я видел в отладке), а метод вызывается из контроллера, поэтому вызов проходит через прокси.

3) Обе службы в контексте корневого приложения. Вывод log.error(context):

Код: Выделить всё

OrderServiceImpl  - Root WebApplicationContext: startup date [Tue Sep 17 21:48:30 FET 2013]; root of context hierarchy
PageServiceImpl  - Root WebApplicationContext: startup date [Tue Sep 17 21:48:30 FET 2013]; root of context hierarchy
Вот код метода:

Код: Выделить всё

@Service
public class OrderServiceImpl extends CRUDServiceImpl implements OrderService {
private static final Logger log = Logger.getLogger(OrderServiceImpl.class);

@Autowired
private OrderRepository repo;

@Autowired
private OrderItemService orderItemService;

@Override
protected CRUDRepository getRepository() {
return repo;
}

@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public Order save(Order entity) {
if (entity.getCreationDate() == null) {
entity.setCreationDate(new Date());
}

if (entity.getId() == null) {
increasePopularityForProductsInOrder(entity);
// throws NoTransactionException: No transaction aspect-managed TransactionStatus in scope
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

decreaseStockNumberForSkusInOrder(entity);
}

return super.save(entity);
}

private void increasePopularityForProductsInOrder(Order order) {
List items = order.getItems();

for (OrderItem item : items) {
orderItemService.increasePopularity(item);
}
}

private void decreaseStockNumberForSkusInOrder(Order order) {
List items = order.getItems();

for (OrderItem item : items) {
orderItemService.removeFromStock(item);
}
}
}
Этот метод вызывается из контроллера. Код контроллера прост, только проверка и вызов orderService.save(...).
Вот моя конфигурация:

applicationContext.xml
servletContext.xml

Код: Выделить всё






























404
404











/WEB-INF/layouts/layouts.xml
/WEB-INF/views/**/views.xml





persistence.xml

Код: Выделить всё


org.hibernate.ejb.HibernatePersistence









Обновление:
CartController.java

Код: Выделить всё

@Controller
public class CartController {
private static final Logger log = Logger.getLogger(CartController.class);

...

@RequestMapping(value = "/cart/submit-order", method = RequestMethod.POST)
public String submit(@RequestParam String email, @RequestParam long deliveryType, Model uiModel, HttpServletRequest request, RedirectAttributes redirectAttrs) {
Order order = CartHelper.getOrderFromRequest(request);
uiModel.addAttribute("email", email);

// 1. check if address is set
if (StringUtil.isEmpty(order.getClientInfo().getFirstName())) {
MessageBean.createErrorMessage("cart.enter-address.error").displayMessage(uiModel);
populateForm(uiModel, order);
return "cart";
}

// 2. check if specified deliveryType exist
DeliveryType type = null;
try {
type = deliveryTypeService.findOne(deliveryType);
} catch (NotFoundException nfe) {
MessageBean.createErrorMessage("cart.invalid-delivery-type.error").displayMessage(uiModel);
populateForm(uiModel, order);
return "cart";
}
order.setDeliveryType(type);

// 3. check if email is valid
if (!StringUtil.isEmailValid(email)) {
MessageBean.createErrorMessage("cart.invalid-email.error").displayMessage(uiModel);
populateForm(uiModel, order);
return "cart";
}
order.getClientInfo().setEmail(email);

// 4. check if order is not empty
if (order.isEmpty()) { // should not be possible
log.warn("Empty order submission registered! " + order);
return "cart/empty";
}

order = orderService.save(order);
CartHelper.updateOrderForRequest(request, order);

// 5. send notification to client
try {
sendNotificationToClient(order, request);
redirectAttrs.addFlashAttribute(MessageBean.MESSAGE_BEAN_KEY, MessageBean.createSuccessMessage("cart.order.successfuly.created"));
} catch (Exception e) {
redirectAttrs.addFlashAttribute(MessageBean.MESSAGE_BEAN_KEY, MessageBean.createErrorMessage("cart.failed.to.send.notification.during.order.saving"));
}

return "redirect:/orders/success";
}

...

}
Если у вас есть какие-либо мысли, пожалуйста, оставьте их. Я схожу с ума по этому поводу.

Подробнее здесь: https://stackoverflow.com/questions/188 ... not-create
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»