2014-12-03 58 views
2

我使用Spring和JPA,并且所有的getter都在工作。我可以从数据库获取对象,但是当我尝试保存某些内容时,出现“没有事务性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(user);我得到这个异常javax.persistence.TransactionRequiredException:没有事务性的EntityManager可用

我能做些什么来解决我的问题?

+0

您使用哪种交易注释?检查你的进口应该是弹簧 – 2014-12-03 12:24:04

+0

我使用的是来自spring的事务(import org.springframework.transaction.annotation.Transactional) – 2014-12-03 14:43:10

+0

但是异常是“javax.persistence.TransactionRequiredException .:没有事务性的EntityManager可用”。为什么服务器不使用spring的事务? – 2014-12-03 14:45:01

回答

1

这是惊人的,但对我的方法的签名就完全不同:

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

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

,因为你在你的第一个案例中它的私人方法和@Transactional没有影响非公共方法 – 2017-04-10 12:32:38

0

我就遇到了这个和别的解决了这个问题对我来说。

我正在使用全Java配置(no-xml)并忘记了我的配置类中的@EnableTransactionManagement注释。而已。

相关问题