Spring + Hibernate = "ручные" транзакции с практическими рекомендациями - PullRequest
2 голосов
/ 30 марта 2012

Мое веб-приложение (Spring3 + Hibernate3) всегда работало со службами, помеченными классом @ Transactional и такой конфигурацией:

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

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory" />
    </bean>

Сейчас ... Я в Google AppEngine. По какой-то неприятной причине я пока не знаю, @Transactional не работает. Он использует некоторый класс в javax.naming, который не входит в белый список. Это заканчивается:

Ошибка создания бина с именем 'mySessionFactory': постобработка объект FactoryBean не выполнен; вложенное исключение java.lang.SecurityException: невозможно получить членов для класса org.hibernate.impl.SessionFactoryImpl

Пожалуйста, не спрашивайте меня, почему ....: - \

Использование Spring HibernateTemplate вместо моего дао (который использует raw factory factory) решило проблему, но я знаю, что она немного устарела.

Итак, я хочу попробовать использовать ручные транзакции старого стиля. Вопросы:

  • где? Я хотел бы сохранить транзакции на уровне сервиса.
  • как?

1 Ответ

6 голосов
/ 31 марта 2012

SessionFactoryImpl зависимость отсутствует в белом списке Google App Engine. В Google обсуждается множество хитов.

Что касается "что делать", у вас есть варианты:

  • Зависит от другого поставщика JPA

  • Ни в коем случае не используйте ORM и переходите на родной язык с Spring JdbcTemplate (мой любимый)

  • Я не уверен, почему вам нужно использовать программное управление транзакциями, поскольку Hibernate является корнем вашей проблемы, но если вы просто хотите узнать, как это сделать, вот черновик:

public class SomeService implements SomeInterface {

   private SomeDao thisDaoWrapsJdbcTemplate;
   private PlatformTransactionManager transactionManager;

   public void setTransactionManager( PlatformTransactionManager transactionManager ) {
      this.transactionManager = transactionManager;
   }

   public void doBusiness( Business: business ) {

      TransactionDefinition def = new DefaultTransactionDefinition();
      TransactionStatus status = transactionManager.getTransaction( def );

      try {

         // do business here
         Money money = Money.LOTS_OF
         ...
         // wire the money in..
         thisDaoWrapsJdbcTemplate.depositLotsOfMoney( money )

         transactionManager.commit( status );

      } catch ( DataAccessException dae ) {

         transactionManager.rollback( status );
         throw dae;
      }
      return;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...