我们有一个在JBoss 5.1上运行的Java应用程序,有时我们需要在某些底层方法抛出JDBCException
的情况下防止事务关闭。
我们有一个类似以下代码的EJB方法
@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;
}
}
}
如果由于约束违规导致
PersistenceException
(包装了由JDBCException
引起的异常)而导致insert
失败,我们希望能在同一事务中使用load
继续执行。目前无法实现,因为容器已经关闭了事务。以下是日志记录内容:
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)
有没有适当的方法可以防止在这个特定情况下事务回滚?