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();
InformationsquelleAutor Vaandu | 2010-10-07
Schreibe einen Kommentar