Domanda

sto usando Primavera 2.5 gestione delle transazioni e ho il seguente set-up:

Bean1

@Transactional(noRollbackFor = { Exception.class })
public void execute() {
  try {
    bean2.execute();
  } catch (Exception e) {
    // persist failure in database (so the transaction shouldn't fail)
    // the exception is not re-thrown
  }
}

Bean2

@Transactional
public void execute() {
  // do something which throws a RuntimeException
}

Il fallimento non è mai persistito nel DB dalla Bean1 perché l'intera transazione viene annullata.

Non voglio aggiungere noRollbackFor in Bean2 perché è usato in un sacco di posti che non hanno logica per eccezioni maniglia di runtime in modo corretto.

C'è un modo per evitare la mia transazione per eseguire il rollback solo quando Bean2.execute () viene chiamato da Bean1?

In caso contrario, credo che la mia migliore opzione è quella di persistere mio fallimento all'interno di una nuova transazione? Tutto il resto pulire posso fare?

È stato utile?

Soluzione

Questa è una delle avvertenze di annotazioni ... la classe non è riutilizzabile!

Se invece si configurano le transazioni nel XML, se sarebbe stato possibile.

Supponendo che si utilizza la configurazione XML: se non è consumare le risorse costose, è possibile creare un'altra istanza di bean2 per l'uso del codice specificato. Cioè, è possibile configurare uno stato, come specificato sopra, e uno senza rullo posteriore per eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top