我正在開發一個JEE應用程序,其中對「facade」bean執行的每個請求都應運行單個事務。透明地管理Java-EE中的每個請求事務
基本上,在每一個方法,我能做到這一點是這樣的:
@Override
public void updateSalaries(float factor)
{
initializeTransaction();
// Actual business code...
commitTransaction();
}
凡ùpdateSalaries()is a method invoked by the client, and where
initializeTransaction()and
commitTransaction()`分別照顧越來越/開始/提交/回滾(如有必要)交易。
不幸的是,事務管理應該更透明:開發人員在編寫業務方法時不應該關心的東西。
因此,「裝飾」這些業務方法的一些方法會很好,但我想不出一種可能的方式來做到這一點。
另一種可能的解決方案我想到的是處理它在中央DataAccessBean
類,在那裏我會在@PostConstruct
啓動事務並提交它@PreDestroy
:
@Stateless
public class DataAccessBean implements IDataAccessBean
{
@PostConstruct
public void initializeTransaction() { /* ... */ }
@PreDestroy
public void endTransaction() { /* ... */ }
@Override
public <T implements Serializable> T getObjectById(
Class<T> objectType, Object key) { /* ... */ }
@Override
public void saveObject(Serializable object) { /* ... */ }
}
我不知道不過,如果我可以依靠這個機制。一個重要的問題是,我需要什麼類型的bean:我懷疑一個有狀態bean是否合適,因爲事務是按請求而不是按會話。也許無狀態bean將是一個不錯的選擇,但是AFAIK無狀態bean在請求完成時可能不會被銷燬(如果它駐留在無狀態bean池中)。
兩個小的約束:
- 溶液不應該依賴於特定的非標準框架或JEE-服務器
- 溶液應與JEE 6和JEE 7
兼容感謝您的建議。