2015-10-31 3 views
1

После разработки метода службы, в том числе метода @Transactional, я столкнулся с проблемой «Без транзакционного EntityManager». Technogoly использует: JPA, Spring, MavenTransactionRequiredException: транзакционный EntityManager недоступен в методе @Transactional

Exception StackTrace

Exception in thread "main" javax.persistence.TransactionRequiredException: No transactional EntityManager available 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:273) 
at com.sun.proxy.$Proxy29.merge(Unknown Source) 
at com.restaurant.DAO.OrderDAOImpl.saveOrder(OrderDAOImpl.java:24) 
at com.restaurant.services.DeliveryStaffServiceImpl.changeStatusOfOrder(DeliveryStaffServiceImpl.java:37) 
at com.restaurant.entities.Main.main(Main.java:161) 

Путь я призываю службу в главный:

DeliveryStaffService del = context.getBean(DeliveryStaffService.class); 
    List<Order> listOfOrders = del.getListOfOrders(); 

Пытаясь выяснить вопрос попытался:

  1. для проверки версий Spring в pom.xml;
  2. , чтобы проверить, являются ли все методы @transactional общедоступными;
  3. добавлены в beans.xml
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

Кроме того, есть несколько сервисов с @Transactional методов Int один и тот же проект, работа без каких-либо проблем.

Вот мой persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
xmlns="http://java.sun.com/xml/ns/persistence" version="2.0" > 
    <persistence-unit name="Restaurant" transaction-type="RESOURCE_LOCAL"> 
     <provider> 
      org.eclipse.persistence.jpa.PersistenceProvider 
     </provider> 
    <properties> 
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:..//RestaurantDB1;create=true" /> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
       <property name="eclipselink.weaving" value="static" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <context:component-scan base-package="com.restaurant"/> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="packagesToScan" value="com.restaurant"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="persistenceUnitName" value="Restaurant"/> 

     <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/> 
     </property> 

     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property value="true" name="showSql"/> 
       <property value="true" name="generateDdl"/> 
       <property name="databasePlatform" value="org.eclipse.persistence.platform.database.DerbyPlatform"/> 
      </bean> 
     </property> 

     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="eclipselink.weaving" value="false" /> 
      </map> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
      <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/> 
     <property name="url" value="jdbc:derby:..//RestaurantDB1;create=true" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <tx:annotation-driven proxy-target-class="true"/> 
</beans> 

Внедрение Service

@Named 
public class KitchenStaffServiceImpl implements KitchenStaffService { 

    @Inject 
    private ItemDAO itemDAO; 
    @Inject 
    private OrderDAO orderDAO; 

    @Override 
    public List<Item> viewItems() { 
     return itemDAO.viewItems(); 
    } 

    @Override 
    @Transactional 
    public void processItem(Item item) { 
     int i=item.getQuantity(); 
     while(i>0){ 
      try { 
       Thread.sleep(1000); 
       --i; 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     item.setIsCooked(true); 
     itemDAO.saveItem(item); 
     System.out.println(item.getId()); 

     List<Item> list = item.getOrder().getListOfDishes(); 
     if(list.stream().allMatch(t -> t.getIsCooked()==true)){ 
      Order ord = item.getOrder(); 
      ord.setStatus(StatusOfDelivery.READY_FOR_SHIPMENT); 
      orderDAO.saveOrder(ord); 
     } 
    } 
} 

DAO Реализация

@Repository 
public class ItemDAOImpl implements ItemDAO{ 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public void saveItem(Item item){ 
     if(item.getId()==0){ 
      em.persist(item); 
     }else 
      em.merge(item); 
    }  
} 

OrderDAOImpelementation с методом saveOrder (ПОСЛЕДОВАТЕЛЬНОСТЬ) такая же, как в ItemDAO (сохраняются()/слияния())

Заранее спасибо за любые предложений

+0

Опубликовать полную трассировку стека исключений. Покажите нам, как вы получаете экземпляр службы. И используйте один элемент , с двумя атрибутами. –

+0

Спасибо за ответ, но ничего не изменилось в параметрах megring для одного поля – ryzhman

+0

Ваш вопрос касательно TransactionRequiredException. Поместите трассировку стека из этого исключения. Не трассировка стека несвязанных исключений. –

ответ

0

вы как раз называя

OrderDAOImpl.saveOrder(); 

от метода

DeliveryStaffServiceImpl.changeStatusOfOrder(); 

, но в данном примере вы показываете, что @Transactional аннотацию ставятся на n несвязанный метод KitchenStaffServiceImpl.processItem(). Скорее всего, вам понадобится аннотация @Transactional на DeliveryStaffServicleImpl.

+0

Ровно! Большое спасибо! – ryzhman

Смежные вопросы