续2:在Spring JPA中使用 Eclipse Link实现

在尝试使用Spring JPA和Eclipse Link进行数据操作时,遇到保存数据失败的情况。尽管没有报错,但数据未能成功存入数据库。尝试在Repository类中添加@Transactional注解和在JPA配置类中启用@EnableTransactionManagement,然后定义TransactionManager的bean,但问题仍未解决。进一步研究发现,问题可能与EclipseLinkJpaDialect中的lazyDatabaseTransaction标志有关,需要将其设置为true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于可以查询数据了,却发现保存数据失败,没报错,但是数据并没有真正存入数据库。

在 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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值