2015-04-14 129 views
3

我想在CrudRepository接口上實現事務。我是一個初學者,我目前的問題是,當收到來自不同客戶的很多請求時,我有時會得到重複。 爲了避免我想在Spring中使用SQL事務及其實現,但我無法使它工作。春季數據CrudRepository和交易

下面是我試圖做到這一點:

@Repository 
@EnableTransactionManagement 
@Transactional 
public interface ApplicationPackageDao extends CrudRepository<ApplicationPackage, Long> { 

/** 
* Find if a record exists for this package name , 
* @param packageName 
* @return 
*/ 
@Transactional 
ApplicationPackage findByPackageName(String packageName); 

} 

但是它似乎並沒有工作。 我試圖在我打電話的Java方法的早期添加@Transactionnal註解,但是我也無法使其工作。

我該如何處理CrudRepository上的事務? 還是我用完全錯誤的東西?

+0

您是否嘗試過在方法的頂部使用'@ Query'註釋?例如:'@Query(「從UPPER(?1)」)'UPPER(a。[attr])中選擇一個[object] – chesh

+0

@chesh將查詢註釋允許我獲取事務操作。我的主要問題是CrudRepository隱含的方法,比如保存。我希望在允許findByPackageName之前等待執行save。 –

回答

2

我的建議是:

使用@Configuration註釋檢查您的上下文和配置類。從documentation

的@EnableTransactionManagement註解提供相當於 支持,如果您使用的是基於Java的配置。只需將 註釋添加到@Configuration類

@EnableTransactionManagement和只着眼 爲@事務上豆類在同一個應用程序上下文他們在

定義,那麼你可以在你的服務中使用@Transactional 即使在方法

希望它可以幫助

+0

謝謝,現在效果更好。其實看起來我在其他地方有另一個問題,但現在我對交易有了更好的認識。非常感謝。 –

+0

@ crm86對於Spring Boot,不需要爲CrudRepository擴展bean提供顯式的java配置;在這種情況下,這個註釋是否仍然需要,還是不適用(當Spring Boot創建bean時它會自動啓用?)? – acidnbass

7

除了crm86的回答一些更筆記@Transactional註釋:

  • 在您的應用程序中註釋入口點似乎是最佳實踐(例如,您的Web控制器方法或預定批次的主要方法)。通過使用註釋屬性TxType,可以確保應用程序中位於更深處的方法中的約束/條件(例如,如果沒有trx-context正在運行,則會拋出TxType.MANDATORY等)。

  • @Transactional註釋只有在類被加載爲spring bean(例如在類級別的@Component註釋)時纔有效果。

  • 請記住,只有RuntimeException會導致回滾。如果您希望導致回滾的checked異常,則必須使用屬性rollbackOn來枚舉每個此類異常。

  • 類級別的註釋適用於此類的所有公共方法。方法級別註釋會覆蓋類級別的註釋。上例中的重複註釋(首先在類級別,然後是方法級別)不起作用。