8 Stimmen

Verhindern eines Transaktions-Rollbacks in JBoss + Hibernate

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X