Chúng tôi có một ứng dụng Java chạy trên JBoss 5.1 và trong một số trường hợp, chúng ta cần ngăn chặn một giao dịch bị đóng trong trường hợp một số phương pháp cơ bản được đưa ra bởi JDBCException
.Ngăn chặn giao dịch rollback trong JBoss + Hibernate
Chúng tôi có một phương pháp EJB trông giống như sau một
@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;
}
}
}
Nếu insert
thất bại vì một PersistenceException
(mà kết thúc tốt đẹp một JDBCException
do vi phạm chế), chúng tôi muốn tiếp tục thực hiện với load
trong cùng một giao dịch.
Chúng tôi không thể thực hiện ngay bây giờ vì giao dịch bị đóng bởi vùng chứa. Đây là những gì chúng ta thấy trong các bản ghi:
lớporg.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 được đánh dấu bằng các chú thích sau
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
Có cách nào thích hợp để ngăn chặn các giao dịch từ lăn trở lại chỉ trong trường hợp cụ thể này?