質問

私はスプリング/JPA/グルーヴィー/ハイバーネートスタックを持っています(注: grいではありません)、そして私は私が取得していることに気づきました No session found for current thread いくつかを実行しようとするとき @Transactional スタートアップの作業。

上にコントローラークラスがあります @PostConstruct, 、aを呼び出します @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();
    //  }
}

ご覧のとおり、私は純粋から離れました @Transactional のアプローチ @PostConstruct 議論された理由から ここ.

じぶんの IPublisher 次のように、グルーヴィーなクラスです。

@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, 、効果がありません。

春のコンテキストクラスでは、定義しています <tx:annotation-driven/>.

私が知る限り、私はすべてを正しく行いました。しかし、私はこれを機能させることができないようです。

他に何が必要ですか?

更新しました:これが私のデータアクセス関連の豆をセットアップする豆です:

<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>
役に立ちましたか?

解決

使用する必要があります HibernateTransactionManager それ以外の DataSourceTransactionManager.

他のヒント

コードには基本的な問題があります。トランザクションの境界は、パブリッシャークラスのcreateStockメソッドで始まり、そこで終了します。コントローラーに伝播しません。トランザクション内でDBクエリ呼び出しを使用します。つまり、トランザクションアノテーションがあるメソッド内の内部。そうでなければ、それは決して機能しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top