Spring + Hibernate ="手动"交易方法

Fab*_* B. 2 google-app-engine spring hibernate transactions

我的webapp(Spring3 + Hibernate3)总是使用@Transactional注释的服务类和这个配置:

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

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory" />
    </bean>
Run Code Online (Sandbox Code Playgroud)

现在......我在Google AppEngine上.由于某些令人讨厌的原因,我还不知道,@ Transactal不起作用.它使用javax.naming中的某个类,该类未列入白名单.它最终得到:

创建名为'mySessionFactory'的bean时出错:FactoryBean对象的后处理失败; 嵌套异常是java.lang.SecurityException:无法获取类org.hibernate.impl.SessionFactoryImpl的成员

请不要问我为什么......: -

使用Spring的HibernateTemplate代替我的dao(使用原始会话工厂)解决了这个问题,但我知道它有点过时了.

所以,我想尝试使用手动旧式交易.问题:

  • 哪里?我想将事务保留在服务层中.
  • 怎么样?

tol*_*ius 6

SessionFactoryImpl依赖项不在Google App Engine白名单中.有很多谷歌点击它讨论它.

至于"做什么",你有选择:

  • 依赖于另一个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;
   }
Run Code Online (Sandbox Code Playgroud)