终于可以查询数据了,却发现保存数据失败,没报错,但是数据并没有真正存入数据库。
在 Repository 类中加入@Transactional 注解:
@Transactional(propagation=Propagation.REQUIRED)
public class JpaFetcherconfigRepository {
还是不行:
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
com.sun.proxy.$Proxy19.persist(Unknown Source)
getorder.JpaFetcherconfigRepository.addFetcherconfig(JpaFetcherconfigRepository.java:22)
org.samsa.webcontroller.SpitHandler.sayHello(SpitHandler.java:47)
搜到一篇解析@Transactional 注解的文章。
http://www.importnew.com/12300.html
在JPA配置类中加入 @EnableTransactionManagement 注解:
@Configuration
@ComponentScan(basePackages="getorder")
@EnableTransactionManagement
public class OrderConfiguration {
同时创建一个 TransactionManager 的 bean:
@Bean
public JpaTransactionManager transactionManager(){
JpaTransactionManager tmgr = new JpaTransactionManager();
return tmgr;
}
再试,出了新的错误:
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: javax/persistence/EntityManager.unwrap(Ljava/lang/Class;)Ljava/lang/Object;
org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
getorder.JpaFetcherconfigRepository$$EnhancerBySpringCGLIB$$f5ff79b9.getFetcherconfigById(<generated>)
org.samsa.webcontroller.SpitHandler.sayHello(SpitHandler.java:37)
没办法,跟进 EclipseLinkJpaDialect 源代码,发现与 lazyDatabaseTransaction 这个flag 有关:
if (!definition.isReadOnly() && !this.lazyDatabaseTransaction) {
// Begin an early transaction to force EclipseLink to get a JDBC Connection
// so that Spring can manage transactions with JDBC as well as EclipseLink.
entityManager.unwrap(UnitOfWork.class).beginEarlyTransaction();
}
于是,试图把这个 lazyDatabaseTransaction 设置成 true.
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource, JpaVendorAdapter jpaVendorAdapter, JpaDialect jpaDialect) {
LocalContainerEntityManagerFactoryBean emfb =
new LocalContainerEntityManagerFactoryBean();
... ...
emfb.setJpaDialect(jpaDialect);