Я пишу простое приложение (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();