2014-10-28 217 views
1

我正在閱讀事務管理使用Spring框架。在第一個組合中,我使用了Spring + hiberante,並使用Hibernate的API來控制事務(Hibenate API)。接下來,我想使用@Transactional註釋進行測試,它確實有效。JPA/JTA/@Transactional Spring註釋

我越來越困惑於:

  1. 待辦事項JPA,JTA,Hibernate的有交易 管理的 「自己」 的方式。作爲一個例子,考慮如果我使用Spring + Hibernate,在 這種情況下你會使用「JPA」事務嗎?

    就像我們有JTA,是否可以說我們可以使用Spring和JTA來控制交易?

  2. @Transactional註解,是具體到Spring 框架?從我所瞭解的情況來看,這個註解是Spring的特定框架。如果這是正確的,是@Transactional使用 JPA/JTA做交易控制?

我的確在線閱讀以清除我的疑惑,但是我沒有得到直接的答案。任何投入都會有很大的幫助。

+0

@ Transactional註解有兩個包:'javax.transaction'和'org.springframework.transaction.annotation.Transactional',所以我猜想有JTA/JPA事務處理和Spring事務處理或Spring實現JPA/JTA交易處理 – 2014-10-28 14:45:12

+0

感謝您的信息。幕後是「org.springframework.transaction.annotation.Transactional」Spring自己的事務機制或使用JPA還是JTA? – CuriousMind 2014-10-28 15:03:37

+0

什麼是您的上下文配置?你使用什麼交易管理器? – 2014-10-28 15:41:41

回答

11

@Transactional在​​3210情況下,使用JPA

@Transactional註解應放在周圍是分不開的所有操作。

所以我們來舉例:

我們有2個型號的即CountryCity。 的CountryCity模型關係映射就像是一個國家或地區可以有多個城市因此映射像,

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

這裏國家映射到多個城市通過延遲加載取得他們。 因此,當我們從數據庫中檢索Country對象時,@Transactinal的作用是,我們將獲取Country對象的所有數據,但不會獲取Set of cities,因爲我們正在提取城市LAZILY。

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

當我們要訪問的國家目標城市的設置,那麼我們將得到空值在集,因爲集合的對象創建僅這一套是不存在的數據初始化讓我們用@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服務可以使單個事務多個呼叫,而不關閉與終點連接。

希望這對你有幫助。

相關問題