【问题标题】:Groovy / Hibernate / @Transaction returns No Session found for current threadGroovy / Hibernate / @Transaction 返回 No Session found for current thread
【发布时间】:2012-01-17 10:02:53
【问题描述】:

我有一个 Spring/JPA/Groovy/Hibernate 堆栈(注意:不是 grails),我发现在尝试执行一些 @987654323 时我得到了一个 No session found for current thread @在启动时工作。

我有一个控制器类,它在 @PostConstruct 上调用另一个类的 @Transactional 方法,该类尝试使用一些要在模拟中使用的示例数据填充数据库。

这是controller 类:

@Component
public class SimulationController {

    private TransactionTemplate transactionTemplate;
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Autowired
    private IPublisher publisher;

    @PostConstruct
    public void intialize()
    {
        this.transactionTemplate = new TransactionTemplate(transactionManager);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                racePublisher.populateData();
            }
        });
    }
    //  Also tried, with no success:    
    //  @PostConstruct
    //  public void initialize()
    //  {
    //      publisher.populateData();
    //  }
}

如您所见,由于讨论了here 的原因,我已经放弃了@PostConstruct 中的纯@Transactional 方法。

我的IPublisher是一个groovy类,如下:

@Component
class Publisher implements IPublisher {

@Autowired
IStockDAO stockDAO

void populateData()
{
    createStock()
}
@Transactional
void createStock()
{
    def list = [new Stock(ticker: "ADBE", name: "Adobe"),
                new Stock(ticker: "MSFT", venueCode: "Microsoft")]
    list.each { stockDAO.create it }
}

这是一个实现:

public interface IPublisher {

    public void populateData();
    public void createStock();
}

注意,我也试过将populateData()标记为@Transactional,没有效果。

在我的 Spring 上下文类中,我定义了 <tx:annotation-driven/>

据我所知,我所做的一切都是正确的。但是,我似乎无法让它发挥作用。

还需要什么?

更新: 以下是设置我的 dataAccess 相关 bean 的 bean:

<beans>
<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven/>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://${database.host}:${database.port}/${database.name}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="50" />
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan">
            <list>
                <value>com.mangofactory.concorde</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop><!--  use create for full drop/create -->
                <prop key="hibernate.connection.autocommit">true</prop>
                <prop key="hibernate.statement_cache.size">0</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>
    <beans>

【问题讨论】:

  • 你的 transactionManager 是如何定义的?
  • @mrembisz 我已将声明添加到问题中

标签: hibernate spring groovy spring-transactions


【解决方案1】:

您应该使用HibernateTransactionManager 而不是DataSourceTransactionManager

【讨论】:

  • 谢谢!就是这样!非常感谢!
  • @mrembisz +1 注意到一件简单的事情 :)
【解决方案2】:

代码存在基本问题。事务边界从 Publisher 类的 createStock 方法开始,到此结束。它不会传播到您的控制器。在事务中使用数据库查询调用。即,在具有 Transactional 注释的方法内。否则它永远不会起作用。

【讨论】:

  • 不知道我明白你在说什么。我在事务中使用 DB 查询调用 - 对 create 的调用包含在 @Transactional 块中
  • @MartyPitt 交易模板代码在交易边界之外。它在 intialize() 方法中不起作用。它将在带有事务注释的方法中工作。
  • @AravindA transactionTemplate.execute()@Transactional 的 api 等价物。此代码应该适用于 IMO。
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
相关资源
最近更新 更多