gpt4 book ai didi

Spring + Hibernate = "manual"事务操作指南

转载 作者:行者123 更新时间:2023-12-02 02:20:33 27 4
gpt4 key购买 nike

我的 web 应用程序(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 中的某个类,该类未列入白名单。最终结果是:

Error creating bean with name 'mySessionFactory': Post-processing of the FactoryBean's object failed; nested exception is java.lang.SecurityException: Unable to get members for class org.hibernate.impl.SessionFactoryImpl

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

使用Spring的HibernateTemplate而不是我的dao(它使用原始 session 工厂)解决了这个问题,但我知道它有点过时了。

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

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

最佳答案

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

关于Spring + Hibernate = "manual"事务操作指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9939462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com