JPA / JTA / @Transactional Spring批注
我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用@Transactional
注释进行测试,它确实起作用。
我对此感到困惑:
- JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使用“ JPA”事务吗?
就像我们拥有JTA一样,是真的可以使用Spring和JTA来控制事务吗?
- 该
@Transactional
注释,是专门针对Spring框架?据我了解,该注释是特定于Spring Framework的。如果正确,是否@Transactional
使用JPA / JTA进行事务控制?
我确实在网上阅读以消除疑虑,但是我没有得到直接的答案。任何输入都会有很大的帮助。
回答:
@Transactional
如果Spring->Hibernate
使用JPA
ie
@Transactional
注释应放在所有不可分割的操作周围。
让我们举个例子:
我们有2个模型的ie Country
和City
。Country
和City
模型的关系映射就像一个国家可以有多个城市,因此映射就像,
@OneToMany(fetch = FetchType.LAZY, mappedBy="country")private Set<City> cities;
在这里,国家/地区映射到多个城市,并懒洋洋地获取它们。因此,@Transactinal
当我们从数据库中检索Country对象时,我们将获得Country对象的所有数据,但由于获得LAZILY而无法获取城市集,因此将发挥作用。
//Without @Transactionalpublic 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 / JTA / @Transactional Spring批注 的全部内容, 来源链接: utcz.com/qa/413459.html