我们有一个运行在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)
,以防止有交易的回滚在短短这个特定的情况下,任何适当的方式?