当前位置: 首页 > 面试题库 >

JPA / JTA / @Transactional Spring批注

邵弘义
2023-03-14
问题内容

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

我对此感到困惑:

  1. JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使用“ JPA”事务吗?

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

  1. @Transactional注释,是专门针对Spring框架?据我了解,该注释是特定于Spring Framework的。如果正确,是否@Transactional使用JPA / JTA进行事务控制?

我确实在网上阅读以消除疑虑,但是我没有得到直接的答案。任何输入都会有很大的帮助。


问题答案:

@Transactional如果Spring->Hibernate使用JPAie

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

让我们举个例子:

我们有2个模型的ie CountryCityCountryCity模型的关系映射就像一个国家可以有多个城市,因此映射就像,

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

在这里,国家/地区映射到多个城市,并懒洋洋地获取它们。因此,@Transactinal当我们从数据库中检索Country对象时,我们将获得Country对象的所有数据,但由于获得LAZILY而无法获取城市集,因此将发挥作用。

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

当我们要从国家对象访问城市集时,我们将在该集合中获得空值,因为仅创建了该集合的Set的对象未使用那里的数据初始化来获取我们使用的Set的值,@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,Service可以在单个事务中进行多个调用,而无需关闭与端点的连接。

希望这对你有所帮助。



 类似资料:
  • 我正在开发一个以JPA(Hibernate)为后端的应用程序。我对每个实体都有一个DAO和JPADAO,我的流程将不止一个实体作为一个工作单元进行更新,所以我决定使用JTA,因为它允许我控制事务,所以我的代码看起来是持久的。xml 现在,当我尝试开始一个事务并将更改提交给实体(不止一个)时,它会抛出和异常,并调用utx。回滚但不会回滚它只提交了部分事务,并没有保存所有实体

  • 我正在阅读使用Spring框架的事务管理。在第一个组合中,我使用Spring Hibernate和Hibernate的API来控制事务(Hibernate API)。接下来,我想使用注释进行测试,它确实起了作用。 我感到困惑的是: > JPA、JTA、Hibernate是否有自己的事务管理方式。举个例子,考虑如果我使用Spring Hibernate,在那种情况下,你会使用“JPA”事务吗? 就像

  • JTA

    JTA - Telnet/SSH for the JAVA(tm) platform JTA 是采用 Java 开发的一个远程登录的客户端软件,支持包括 Telnet 和 SSH 协议。

  • 问题内容: 批注在JPA中如何工作? 我找到了各种答案,摘录如下: JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改。当JPA运行时检测到尝试同时修改同一记录的尝试时,它将向尝试最后提交的事务抛出异常。 但是我仍然不确定它是如何工作的。 同样从以下几行开始: 您应该考虑版本字段是不变的。更改字段值会产生不确定的结果。 这是否意味着我们应该将version字段声明为? 问题答案: 但是我

  • 问题内容: 我正在尝试使用Spring测试实体EJB3。 EJB本身不使用Spring,并且我想使生产JPA配置的重复保持最少(例如,不重复persistence.xml)。 我的单元测试似乎可以正常工作,但是即使我的单元测试应该是事务性的,数据仍会在各种测试方法之间持久存在…… 这是我的实体: 我的单元测试: 和我的appContext.xml: 当我运行测试时,test2失败,因为它找到了两个

  • 这是一个配置JPA和使用JTA事务模式连接数据库的简单指南。此外,它还包括开发人员最常见的错误,您应该避免这些错误。希望这对你有帮助。