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>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
具体如下。
我的spring配置文件有两个:spring-mvc.xml和spring-jpa.xml,其中第一个是作为DispatcherServlet启动时加载的配置文件。起初事务配置是放在spring-jpa.xml里面的,这样就出现了"可以查询,但是不能添加,改,删"的现象(即本问题),之后将事务相关的配置移到spring-mvc.xml中就可以了。