Spring Transaction - automatischer rollback der vorherigen db-updates, wenn ein db-update fehlschlägt
Ich Schreibe eine einfache Anwendung (Spring + Hibernate + PostgreSql-db). Ich versuche nur, zu konstruieren, ein Beispiel-Objekt und speichern in db.
Betreibe ich eine einfache java-Klasse mit main-Methode, wo ich geladen habe die Datei ApplicationContext und habe Referenz auf die service-Klasse als unten
TestService srv = (TestService)factory.getBean("testService");
Anwendung Kontext - Kontext :
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryVsm" />
</bean>
<bean id="testService" class="com.test.service.TestServiceImpl">
<property name="testDao" ref="testDao"/>
</bean>
<bean id="testDao" class="com.test.dao.TestDaoImpl>
<property name="sessionFactory" ref="sessionFactoryVsm"/>
</bean>
In TestService ich habe injiziert TestDao. In der test-service-Methode, die ich konstruiert haben, die auf Mitarbeiter-Objekte
emp1 und emp2 und ruft dao zweimal zu aktualisieren.
TestDaoImpl code:
public void saveOrUpdate(BaseDomainModel baseObject) {
Session session = null;
try {
session = getHibernateTemplate().getSessionFactory().openSession();
session.saveOrUpdate(baseObject);
session.flush();
} catch (Exception e) {
logger.error("Generic DAO:saveOrUpdate::" + e);
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
Wenn emp2-update schlägt fehl, emp1 sollte auch scheitern. Wie mache ich das. Bitte um Rat
Vielen Dank im Voraus
Aktualisiert :
Dank Nanda. Ich habe versucht, Deklarative Transaktion. Aber es funktioniert nicht. emp1 wird beibehalten und nicht zurückgenommen eveb zweiten dao-Aufruf fehlschlägt. Ich habe die Transaktion auch die Beratung der Methode.
um zu testen, ob die Transaktion Beratung angewendet wird oder nicht, ich habe die Propaganda "NOT_SUPPORTED". aber noch emp1 wird beibehalten. die Erwartung ist, dass wir sollten haben der Transaktion Nicht Unterstützt Typ der exception. bitte um Rat .
AKTUALISIERT
@seanizer - vielen Dank für das update. Ich habe sogar versucht, indem
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void saveEmp(Employee emp)
zu diesem service-Methode. Aber es hat nicht funktioniert. Außerdem Durchlaufen die Sammlung halt nur gut, wenn muss ich anrufen einer dao. Wenn im Fall, ich habe zu nennen, zwei verschiedene dao beibehalten obj1 und obj2 - dies kann nicht helfen. Nur um zu überprüfen, ob die Transaktion wird immer angewendet, bekomme ich
@Transactional(propagation=Propagation.NOT_SUPPORTED).
Aber noch obj1 bekam beibehalten.
Ich habe gerade Zweifel, ob die xml-Konfiguration/annotation korrekt gegeben ist. bitte überprüfen Sie
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryVsm" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="saveEmp" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="testServiceOperation" expression="execution(*com.test.service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="testServiceOperation"/>
</aop:config>
Bin ich mit dem org.springframework.orm.hibernate3.HibernateTransactionManager für transactionManager. Ist das richtig ?
Aktualisiert
Ich habe meine exception-Klasse myRuntimeExp, die sich von RuntimeException und werfen die gleichen von Dao-Methode der service-Methode. aber immer noch der rollback ist nicht passiert. Ich habe gerade Zweifel, ob ich richtig angesichts der Konfigurationen in der applnContext.xml. Kann mir jemand helfen, wie um zu prüfen, ob die Transaktion Beratung /annotation angewendet wird die Methode oder nicht? gibt es eine Möglichkeit von Ausführung in einem debugging-Modus und prüfen,
Problem :
War ich mit
session = getHibernateTemplate().getSessionFactory().openSession();
Aber es sollte aktuelle Sitzung und es funktioniert Prima.
session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie deklaratives Transaktions-management, können Sie verlieren die meisten dieses boilerplate:
TestDaoImpl:
Und Sie können Steuern, die Handhabung der Transaktionen aus der service-Ebene mit
@Transactional
(oder die xml-Konfiguration)TestServiceImpl:
Referenz:
Hibernate 3 API
Standardmäßig Frühjahr nur ein Rollback für eine ungeprüfte Ausnahme. Sie haben, um den rollback-für Attribut und angeben, welche Ausnahme Sie versuchen zu fangen.
Aus der Feder Dokumentation:
Hier, bekommen diese Schnipsel und hoffe Sie helfen Euch:
Diese sollten die Dinge, die Sie brauchen. Sie müssen nicht in der gleichen Datei, vielleicht teilen Sie diese zwischen services und daos.
Können Sie die sessionFactory in TestServiceImpl und öffnen Sie die Sitzung.
weiterer Punkt ist zu überprüfen, ob der Datenbank-Unterstützung der Transaktion