Spring Transaction - автоматический откат предыдущих обновлений базы данных при сбое одного обновления базы данных

Я пишу простое приложение (Spring + Hibernate + PostgreSql db). Я просто пытаюсь создать образец объекта и сохранить его в базе данных.

Я запускаю простой основной метод класса Java, в котором я загрузил applicationContext и получил ссылку на класс службы, как показано ниже

TestService srv = (TestService)factory.getBean("testService");  

Контекст приложения - контекст:

<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>

В TestService я ввел TestDao. В тестовом методе обслуживания я построил объекты для сотрудников Я запускаю простой основной метод класса java, в который загружаю ...

Я пишу простое приложение (Spring + Hibernate + PostgreSql db). Я просто пытаюсь создать образец объекта и сохранить его в базе данных.

Я запускаю простой основной метод класса Java, в котором я загрузил applicationContext и получил ссылку на класс службы, как показано ниже

TestService srv = (TestService)factory.getBean("testService");  

Контекст приложения - контекст:

<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>

В TestService я ввел TestDao. В тестовом методе обслуживания я построил объекты для сотрудников Я запускаю простой основной метод класса java, в который загружаю ...

Я пишу простое приложение (Spring + Hibernate + PostgreSql db). Я просто пытаюсь создать образец объекта и сохранить его в базе данных.

Я запускаю простой основной метод класса Java, в котором я загрузил applicationContext и получил ссылку на класс службы, как показано ниже

TestService srv = (TestService)factory.getBean("testService");  

Контекст приложения - контекст:

<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>

В TestService я ввел TestDao. В тестовом методе обслуживания я построил объекты для сотрудников

<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>

В TestService я ввел TestDao. В тестовом методе обслуживания я построил объекты для сотрудников

<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>

В TestService я ввел TestDao. В тестовом методе обслуживания я построил объекты для сотрудников emp1 и emp2 и дважды вызываем dao для обновления.

Код TestDaoImpl:

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();
        }
    }

}

При сбое обновления emp2 emp1 также должен завершиться ошибкой. Как я это сделал. Пожалуйста, посоветуйте

Заранее спасибо

Обновлено:

Спасибо, Нанда. Я пробовал декларативную транзакцию. Но это не работает. emp1 сохраняется и не откатывается. eveb второй вызов dao терпит неудачу. Я добавил к методу совет по транзакции.

, чтобы проверить, применяется ли совет по транзакции или нет, я изменил распространение на «NOT_SUPPORTED». но все равно emp1 сохраняется. ожидается, что мы должны были получить исключение типа Transaction Not Supported. пожалуйста, совет.

ОБНОВЛЕНО

@seanizer - Спасибо за обновление. Я даже пробовал добавить

@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void saveEmp(Employee emp)

к этому методу обслуживания. Но это не сработало. Кроме того, повторение коллекции хорошо, только если мне нужно позвонить одному дао. Если в случае, если мне нужно вызвать два разных дао, чтобы сохранить obj1 и obj2, это может не помочь. Просто чтобы проверить, применяется ли транзакция, я получаю @Transactional (распространение = Propagation.NOT_SUPPORTED) . Но все же obj1 сохранился. Я просто сомневаюсь, что приведенная конфигурация / аннотация XML верна. пожалуйста, проверьте

<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> 

Я использую org.springframework.orm.hibernate3.HibernateTransactionManager для transactionManager. Это правильно?


Обновлено

Я создал свой класс исключения myRuntimeExp, расширяющий RuntimeException и передавая его из метода Dao в метод службы. но все равно отката не происходит. Я просто сомневаюсь, правильно ли я указал конфигурации в файле applnContext.xml. Может ли кто-нибудь помочь мне, как проверить, применяется ли совет / аннотация транзакции к методу или нет? есть ли способ запустить его в режиме отладки и проверить

Проблема:

Я использовал

session = getHibernateTemplate().getSessionFactory().openSession();

Но это должен быть текущий сеанс, и он работает нормально.

session = getHibernateTemplate().getSessionFactory().getCurrentSession();
5
задан mate00 2 October 2019 в 07:24
поделиться