开发者社区> 问答> 正文

spring + jpa 配置问题,No transactional EntityManager available

javax.persistence.TransactionRequiredException: No transactional EntityManager available
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:273)
    at com.sun.proxy.$Proxy21.persist(Unknown Source)
    at cn.com.demo.common.dao.impl.JpaDaoImpl.save(JpaDaoImpl.java:32)
JPA执行查询没问题,可在执行添加操作时,无法插入数据。

网上查了很多资料,也没能处理,希望OSC的朋友能帮忙看看。

我的相关配置如下(没有使用persistence.xml)

JpaDaoImpl中的方法

@PersistenceContext
    protected EntityManager em;
 
    @Override
    public <T> void save(T entity) {
        em.persist(entity);
    }

<bean id="jpaEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="persistenceProvider" ref="persistenceProvider" />
 <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
 <property name="jpaDialect" ref="jpaDialect" />
      <property name="packagesToScan">
 <list>
 <value>cn.com.demo</value>
 </list>
 </property>
        <property name="jpaProperties">
            <props>
               <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
 <prop key="hibernate.max_fetch_depth">3</prop>
 <prop key="hibernate.jdbc.fetch_size">18</prop>
 <prop key="hibernate.jdbc.batch_size">10</prop>
 <prop key="hibernate.show_sql">true</prop>
 <prop key="hibernate.format_sql">true</prop>
 <prop key="javax.persistence.validation.mode">none</prop>
 <!-- 自动建表 -->
 <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
   </bean>
 
 
 <!-- 用于指定持久化实现厂商类 -->
 <bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence" />
 <!-- 用于设置JPA实现厂商的特定属性 -->
 <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
 <property name="database" value="MYSQL" />
 </bean>
 <!-- 用于指定一些高级特性 -->
 <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
 
 
 <!-- 事务管理器 -->
 <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
 <property name="entityManagerFactory" ref="jpaEntityManagerFactory" />
 </bean>
  
 <!-- 使用annotation定义事务
 <tx:annotation-driven transaction-manager="jpaTransactionManager" proxy-target-class="true" />
 -->
   <!-- 声明式事务配置 -->
    <tx:advice id="txAdvice" transaction-manager="jpaTransactionManager">
        <tx:attributes>
            <tx:method name="get*" propagation="NOT_SUPPORTED" read-only="true" />
            <tx:method name="count*" propagation="NOT_SUPPORTED" read-only="true" />
            <tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true" />
            <tx:method name="query*" propagation="NOT_SUPPORTED" read-only="true" />
            <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
     
    <!-- 只对业务逻辑层实施事务  -->
    <aop:config>
        <aop:pointcut id="txPointcut" expression="execution(* cn.com.demo.*.service.impl.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>

展开
收起
a123456678 2016-03-19 11:00:25 7631 0
1 条回答
写回答
取消 提交回答
  • 具体如下。

    我的spring配置文件有两个:spring-mvc.xml和spring-jpa.xml,其中第一个是作为DispatcherServlet启动时加载的配置文件。起初事务配置是放在spring-jpa.xml里面的,这样就出现了"可以查询,但是不能添加,改,删"的现象(即本问题),之后将事务相关的配置移到spring-mvc.xml中就可以了。

    2019-07-17 19:07:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多