2016-11-18 3 views
0

Meine grundlegende Anforderung mehr session Objekte hat zwei verschiedene Schemata-zu-Punkt (dies ist logische Gruppierung, jede logische Gruppe in ihm mehrere Schemata haben), so ist hier Konfiguration: Mehrere Transaktions-Manager mit mehrere Sitzung Fabriken

<tx:annotation-driven transaction-manager="transactionManager1" /> 
<transactionManager1> 
    <sessionFactory1> 
</transactionManager1> 

<tx:annotation-driven transaction-manager="transactionManager2" /> 
<transactionManager2> 
    <sessionFactory2> 
</transactionManager2> 

jetzt habe ich Dao-Klasse, die Methode speichern

@Transactional 
public void save(Object){ 
    sessionFactory2.getCurrentSession().save(object); 
} 

dieser Code funktioniert gut, aber meine Frage ist, hat derjenige, der Transaktions-Manager von @Transactional ann abgeholt werden Hinweis?

oder gibt es eine Möglichkeit, es im Protokoll zu drucken?

+0

Bitte schlagen Sie auch vor Wenn ich die Logik der @transactional Annotation ändern kann. –

+0

In Ihrem Fall 'transactionManager2' ... Mehrere ' Elemente zu haben hat keinen Sinn und ist ziemlich nutzlos. Der letzte ist derjenige, der wirksam sein wird. Und wenn Sie einen bestimmten 'Transaktionsmanager' angeben, wird dieser standardmäßig verwendet, wenn in der '@ Transactional'-Annotation kein expliziter' Transaktionsmanager 'definiert ist. –

Antwort

0

Wenn die (Pseudo-) Konfiguration, die Sie gepostet haben, auch die Reihenfolge ist, in der Sie sie definiert haben Konfiguration wird dann immer die transactionManager2 verwendet.

Das Definieren mehrerer Elemente <tx:annotation-driven /> hat keine Verwendung. Mit diesem Element geben Sie an, dass Sie Annotation-getriebene Transaktionen verwenden möchten und dass Sie den angegebenen transaction-manager als Standard-Transaktionsmanager verwenden möchten.

In Ihrem Fall haben Sie 2 definiert und der letzte wird derjenige sein, der effektiv ist.

Wenn Sie mehrere Transaktionsmanager verwenden, MÜSSEN Sie in der @Transactional Annotation angeben, welcher Transaktionsmanager für diese bestimmte Transaktionsmethode verwendet werden soll.

Sie müssen also entweder @Transactional("transactionManager1") oder angeben, je nachdem, welches Sie als Standard sehen.

+0

Danke Deinum, jetzt kann ich mir Hintergrundprozess vorstellen. Aber nachdem ich Ihre Antwort durchgearbeitet habe, kommen mir noch einmal zwei Fragen in den Sinn: 1. Gibt es einen Prozess, bei dem ich den Transaktionsmanager dynamisch auswählen kann, wenn die Annotation angewendet wird? 2. Was ist die sessionFactory-Instanz, die wir in den Transaktionsmanager setzen? Denn in diesem Fall kann es passieren, dass transactionManager2 beim Speichern von entity mit sessionFactory1 angewendet wird, wobei keine Beziehung mit sessionFactory1 und transactionManager2 besteht. –

Verwandte Themen