程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Spring Boot + Hibernate + JPA没有可用的事务性EntityManager大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Spring Boot + Hibernate + JPA没有可用的事务性Entitymanager?

开发过程中遇到Spring Boot + Hibernate + JPA没有可用的事务性Entitymanager的问题如何解决?下面主要结合日常开发的经验,给出你关于Spring Boot + Hibernate + JPA没有可用的事务性Entitymanager的解决方法建议,希望对你解决Spring Boot + Hibernate + JPA没有可用的事务性Entitymanager有所启发或帮助;

首先,我引用Spring-Data JPA文档来说明为什么该delete方法在您的情况下有效(我的意思是选项 )。

delete方法实际上是的方法CrudRepository。您的存储库JpaRepository可以扩展CrudRespository,而扩展则可以扩展,因此它属于CrudRepository接口,并且根据上面的引用是事务性的。

如果阅读了“ 事务性查询方法 ”一节,您将看到与选项 相同的内容,并且您将知道如何对存储库的所有方法应用自定义事务行为。此外,文档的 示例61 显示了与选项 相同的场景。

现在请记住,您不是在使用JDBC逻辑,在这种情况下,数据库会处理事务,但要在基于ORM的框架中进行。ORM框架需要事务才能触发对象高速缓存和数据库之间的同步。因此,您必须了解并为执行ORM逻辑的方法提供事务上下文deleteByCustomerID

默认情况下@transactional(我的意思是没有任何参数)将传播模式设置requiredfalse,将Readonly标志设置为false。调用其中注释的方法时,如果不存在任何事务,则会初始化事务。这就是为什么的原因,解决办法 @LuCassaldanha的(同例如 使用一个门面来定义多个库调用交易 )和选项 作品。否则,如果没有事务,您将陷入选项 的抛出异常。

解决方法

我在Hibernate上通过JPA使用Spring Boot 1.2.3.RELEASE版本。我遇到以下异常

org.springframework.dao.InvalidDataAccessApiUsageException: No transactional Entitymanager available; nested exception is javax.persistence.transactionrequiredException: No transactional Entitymanager available
at org.springframework.orm.jpa.EntitymanagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntitymanagerFactoryUtils.java:410) ~[EntitymanagerFactoryUtils.class:4.1.6.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:223) ~[HibernateJpaDialect.class:4.1.6.RELEASE]
at org.springframework.orm.jpa.AbstractEntitymanagerFactoryBean.translateExceptionIfPossible(AbstractEntitymanagerFactoryBean.java:417) ~[AbstractEntitymanagerFactoryBean.class:4.1.6.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) ~[ChainedPersistenceExceptionTranslator.class:4.1.6.RELEASE]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[DataAccessUtils.class:4.1.6.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) ~[PersistenceExceptionTranslationInterceptor.class:4.1.6.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [ReflectiveMethodInvocation.class:4.1.6.RELEASE]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulaTingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) ~[CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulaTingMethodIntercceptor.class:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [ReflectiveMethodInvocation.class:4.1.6.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [ExposeInvocationInterceptor.class:4.1.6.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [ReflectiveMethodInvocation.class:4.1.6.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) [JdkDynamicAopProxy.class:4.1.6.RELEASE]
at com.sun.proxy.$Proxy110.deleteByCustomerId(Unknown sourcE) ~[na:na]

Caused by: javax.persistence.transactionrequiredException: No transactional Entitymanager available
at org.springframework.orm.jpa.SharedEntitymanagerCreator$SharedEntitymanagerInvocationHandler.invoke(SharedEntitymanagerCreator.java:275) ~[SharedEntitymanagerCreator$SharedEntitymanagerInvocationHandler.class:4.1.6.RELEASE]
at com.sun.proxy.$Proxy102.remove(Unknown sourcE) ~[na:na]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$deleteExecution.doExecute(JpaQueryExecution.java:270) ~[JpaQueryExecution$deleteExecution.class:na]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74) ~[JpaQueryExecution.class:na]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97) ~[AbstractJpaQuery.class:na]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88) ~[AbstractJpaQuery.class:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:395) ~[RepositoryFactorySupport$QueryExecutorMethodInterceptor.class:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373) ~[RepositoryFactorySupport$QueryExecutorMethodInterceptor.class:na]

以下是我的程序结构
Configuration类

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnabletransactionManagement
public class WSApplication {
    public static void main(final String[] args) {
        SpringApplication.run(WSApplication.class,args);
    }
}

@Entity
@Table(orders)
public class Order {
    @id
    @GeneratedValue
    private long id;

    @column(name = "customerId")
    private Long customerId;

    // getter & setter methods
    // equals & hashCode methods
}

public interface OrderRepository extends JpaRepository<Order,Long> {

    List<Order> findByCustomerId(Long customerId);

    // 4- @transactional works fine
    void deleteByCustomerId(Long cusotmerId);

}

public class orderservice {

    @Autowired
    private OrderRepository repo;

    // 3- @transactional works fine
    public void deleteOrder(long customerId){
        //1- throws exception
        repo.deleteByCustomerId(customerId);

        //2- following works fine
        //repo.delete(repo.findByCustomerId(customerId).get(0));
    }

}

在上面的服务类代码中,谁能指导我为什么2起作用而1抛出异常。

谢谢

大佬总结

以上是大佬教程为你收集整理的Spring Boot + Hibernate + JPA没有可用的事务性EntityManager全部内容,希望文章能够帮你解决Spring Boot + Hibernate + JPA没有可用的事务性EntityManager所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。