2014-12-03 3 views
2

Я использую весну с JPA, и все мои геттеры работают. Я могу получить объект из базы данных, но когда я пытаюсь что-то сэкономить, я получаю сообщение об ошибке «Без транзакционного EntityManager доступно», и у меня есть аннотации для транзакций.Spring - PersistenceContext - нет транзакционного EntityManager

Вот мой DAO:

@Repository("userDao") 
    @Transactional 
    //public class UserDaoImpl extends GenericDaoImpl<User, Long> implements IUserDao { 
    public class UserDaoImpl implements IUserDao { 

     final protected Logger logger = LoggerFactory.getLogger(this.getClass()); 

     public UserDaoImpl() { 
     } 

     @PersistenceContext(unitName = "ovdigitalPU") 
     protected EntityManager entityManager; 

    @Override 
     @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 
     public void save(User user) throws DuplicatedUserException { 
      logger.info("Creating User with username: " + user.getUsername()); 
      User foundUser = null; 
      logger.info("Checking if user already existis..."); 
      /*foundUser = this.findByUsername(user.getUsername()); 

      if(foundUser != null) { 
       throw new DuplicatedUserException(); 
      }*/ 

      entityManager.persist(user); 
      logger.info("User " + user.getUsername() + " was been saved with success!"); 

     } 

Вот мой корневой context.xml

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

    <!-- Root Context: defines shared resources visible to all other web components --> 
    <context:annotation-config /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="ovdigitalDS" 
     class="org.apache.commons.dbcp.BasicDataSource" 
     p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost/ovdigital" 
     p:username="ovdigital" p:password="12345"> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="ovdigitalDS" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
    </bean> 

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

    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <context:spring-configured /> 
    <context:annotation-config /> 

</beans> 

И мой persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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"> 
     <persistence-unit name="ovdigitalPU"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.transaction.auto_close_session" value="false"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="false"/> 
      <property name="hibernate.generate_statistics" value="false"/> 
      <property name="hibernate.connection.autocommit" value="true"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     </properties> 
     </persistence-unit> 
    </persistence> 

В режиме отладчика, когда сервер попытается выполнить эту строку - entityManager.persist (пользователь); я получаю это исключение javax.persistence.TransactionRequiredException: транзакционный EntityManager не доступен.

Что я могу сделать, чтобы решить мою проблему?

+0

Какую трансакционную аннотацию вы используете? проверьте свой импорт, он должен быть весной –

+0

Я использую транзакции с весны (импорт org.springframework.transaction.annotation.Transactional) –

+0

Но исключение - «javax.persistence.TransactionRequiredException .: Отсутствует транзакционный EntityManager». Почему сервер не использует транзакции с весны? –

ответ

1

Это удивительно, но для меня подпись метода сделал все различия:

@Transactional 
void save(Entity entity) //throw No transactional EntityManager available 

и

@Transactional 
public void save(Entity entity) //ok 
+1

, потому что в вашем первом случае его частный метод и @Transactional не влияют на непубличные методы –

0

Я побежал в этом и что-то еще решить это для меня.

Я использую конфигурацию all-Java (no-xml) и забыл аннотацию @EnableTransactionManagement в своем классе конфигурации. Вот и все.

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