当前位置: 首页 > 知识库问答 >
问题:

JPA/JTA/@事务性Spring注释

云和硕
2023-03-14

我正在阅读使用Spring框架的事务管理。在第一个组合中,我使用Spring Hibernate和Hibernate的API来控制事务(Hibernate API)。接下来,我想使用@Transactional注释进行测试,它确实起了作用。

我感到困惑的是:

>

  • JPA、JTA、Hibernate是否有自己的事务管理方式。举个例子,考虑如果我使用Spring Hibernate,在那种情况下,你会使用“JPA”事务吗?

    就像我们有JTA一样,说我们可以使用Spring和JTA来控制事务是真的吗?

    @Transactional注释是专门针对Spring框架的吗?据我所知,此注释是特定于Spring框架的。如果这是正确的,@Transactional是否使用JPA/JTA进行事务控制?

    我确实在网上阅读来澄清我的疑问,但是有些事情我没有得到直接的答案。任何投入都会大有帮助。

  • 共有1个答案

    司空均
    2023-03-14

    @Transactionalin case ofSpring-

    @Transactional注释应该放在所有不可分割的操作周围。

    让我们举个例子:

    我们有两种型号,即国家城市。国家/地区和城市的关系映射就像一个国家可以有多个城市,所以映射是这样的,

    @OneToMany(fetch = FetchType.LAZY, mappedBy="country")
    private Set<City> cities;
    

    在这里,国家映射到多个城市,懒洋洋地获取它们。当我们从数据库中检索国家对象时,我们将获得国家对象的所有数据,但不会获得城市集,因为我们正在获取城市懒惰。

    //Without @Transactional
    public Country getCountry(){
       Country country = countryRepository.getCountry();
       //After getting Country Object connection between countryRepository and database is Closed 
    }
    

    当我们希望从country对象访问城市集时,我们将在该集中获取空值,因为仅创建该集的集合对象未使用这些数据初始化,以获取我们使用的集合值@Transactional,即。,

    //with @Transactional
    @Transactional
    public Country getCountry(){
       Country country = countryRepository.getCountry();
       //below when we initialize cities using object country so that directly communicate with database and retrieve all cities from database this happens just because of @Transactinal
       Object object = country.getCities().size();   
    }
    

    所以基本上@Transactional是服务可以在单个事务中进行多次调用,而无需关闭与终端的连接。

    希望这对你有帮助。

     类似资料:
    • 问题内容: 我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用注释进行测试,它确实起作用。 我对此感到困惑: JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使

    • 在我们的一个项目中,我们遇到了一个问题,Spring忽略了事务注释,然后失败了,出现了以下错误。 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2018-09-13 15:05:18406错误[主]组织。springframework。靴子SpringApplication应用程序运行失败组织。springframework。道。Inva

    • 问题内容: 关于Spring JPA存储库事务性的1个快速问题。我有未标记为事务性的服务,并调用了Spring JPA存储库方法 它被定义为 问题是它失败,并且“ 没有EntityManager,当前线程没有可用的实际事务- 无法可靠地处理’remove’调用;嵌套异常是javax.persistence.TransactionRequiredException “异常。 好的,我可以通过将服务

    • 关于Spring JPA存储库事务性的1个快速问题。我有一个未标记为事务性的服务,并调用Spring JPA存储库方法 好的,我可以通过标记服务或deleteByEmail(..)来解决它方法作为事务性的,但我就是不明白为什么它现在会崩溃。Spring文档明确指出“存储库实例上的CRUD方法在默认情况下是事务性的。”(http://docs.spring.io/spring-data/jpa/do

    • 根据java docs for@Lock Annotation: 用于指定执行查询时要使用的LockModeType的注释。在查询方法上使用Query或从方法名称派生查询时,将评估它。 如上所述,将使用@Query annotation或findBySomething对其进行评估。。()方法。 但根据我的发现,当我在任何方法中使用@Transactional放置@Lock注释,并在该事务方法中从d

    • 试图收集和理解@事务性注释的要点并越过了一点。因此,在使用事务性注释时,我们需要记住的主要事情是: 事务注释只能应用于公共方法[根据Spring@Transactional属性对私有方法起作用吗? 事务性注释应该应用于具体的类,而不是接口[根据我应该将@transactional annotation放在接口定义还是实现类的位置? 事务注释应应用于服务级别[根据Spring@Transaction