Wir haben eine Java-Anwendung, die auf JBoss 5.1 läuft, und in einigen Fällen müssen wir verhindern, dass eine Transaktion geschlossen wird, wenn ein JDBCException
von einer zugrunde liegenden Methode ausgelöst wird.
Wir haben eine EJB-Methode, die wie die folgende aussieht
@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;
}
}
}
Wenn insert
scheitert an einer PersistenceException
(die eine Hülle aus JDBCException
durch einen Verstoß gegen eine Einschränkung verursacht), wollen wir die Ausführung mit load
innerhalb der gleichen Transaktion.
Wir können dies im Moment nicht tun, da die Transaktion durch den Container abgeschlossen ist. Das ist, was wir in den Protokollen sehen:
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 >
Die EJB-Klasse ist mit den folgenden Anmerkungen versehen
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
Gibt es eine geeignete Methode, um zu verhindern, dass die Transaktion in diesem speziellen Fall zurückgenommen wird?