我們有一個運行在JBoss 5.1上的Java應用程序,在某些情況下,我們需要防止某個基礎方法拋出JDBCException
時事務被關閉。防止在JBoss + Hibernate中進行事務回滾
我們有一個看起來像下面的一個
@PersistenceContext(unitName = "bar")
public EntityManager em;
public Object foo() {
try {
insert(stuff);
return stuff;
} (catch PersistenceException p) {
Object t = load(id);
if (t != null) {
find(t);
return t;
}
}
}
如果insert
因爲PersistenceException
的失敗(它包裝引起的約束違反JDBCException
),我們希望繼續與中load
執行EJB方法同樣的交易。
我們現在無法做到這一點,因爲交易是由容器關閉的。下面是我們在日誌中看到:
org.hibernate.exception.GenericJDBCException: Cannot open connection
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
...
Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000101:85fe:4f04679d:182 status: ActionStatus.ABORT_ONLY >
EJB類標有以下注釋
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
,以防止有交易的回滾在短短這個特定的情況下,任何適當的方式?