groovy / hibernate / @transaction現在のスレッドのセッションは見つかりません
-
29-10-2019 - |
質問
私はスプリング/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クエリ呼び出しを使用します。つまり、トランザクションアノテーションがあるメソッド内の内部。そうでなければ、それは決して機能しません。