Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy/Hibernate/@Transaction未返回当前线程的会话_Hibernate_Spring_Groovy_Spring Transactions - Fatal编程技术网

Groovy/Hibernate/@Transaction未返回当前线程的会话

Groovy/Hibernate/@Transaction未返回当前线程的会话,hibernate,spring,groovy,spring-transactions,Hibernate,Spring,Groovy,Spring Transactions,我有一个Spring/JPA/Groovy/Hibernate堆栈(注意:不是grails),我发现在尝试在启动时执行一些@事务性的工作时,当前线程的找不到会话 我有一个控制器类,它在@PostConstruct时,调用另一个类上的@Transactional方法,该类尝试用模拟中使用的一些示例数据填充数据库 以下是控制器类: @Component public class SimulationController { private TransactionTemplate trans

我有一个Spring/JPA/Groovy/Hibernate堆栈(注意:不是grails),我发现在尝试在启动时执行一些
@事务性的
工作时,当前线程的
找不到会话

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

以下是
控制器
类:

@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();
    //  }
}
如您所见,出于讨论的原因,我在
@PostConstruct
中不再使用纯
@Transactional
方法

My
IPPublisher
是一个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上下文类中,我定义了

据我所知,我做的每件事都是正确的。然而,我似乎无法让这个工作

还需要什么

更新: 以下是设置我的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>

协和式飞机
${hibernate.dial}
org.hibernate.cache.HashtableCacheProvider
真的
真的
更新
真的
0
20

该代码存在一些基本问题。事务边界从Publisher类的createStock方法开始,并在那里结束。它不会传播到您的控制器。在事务中使用DB查询调用。i、 e,在具有事务注释的方法内部。否则它永远不会起作用

你应该使用
HibernateTransactionManager
而不是
DataSourceTransactionManager

我不知道你在说什么。我在事务中使用DB查询调用-对
create
的调用封装在
@Transactional
block@MartyPitt交易模板代码在交易边界之外。它在initialize()方法中不起作用。它将在带有事务性注释的方法中工作。@AravindA
transactionTemplate.execute()
是与
@transactional
等效的api。这段代码在我看来应该可以使用。transactionManager是如何定义的?@mrembisz我已经将声明添加到问题中了。谢谢!就这样!非常感谢@mrembisz+1表示注意到简单的事情:)