2012-02-08 23 views
1

私は以下の問題があります。 私のウィケットアプリケーションでは、@ Transactionalアノテーションを使用したいと思います。 すべてのDAOに@Componentアノテーションが読み込まれます。Wicket Spring Hibernate Transactional

@Component 
@Transactional(propagation = Propagation.SUPPORTS) 
public class AccountHibernateDataAccessHelper implements 
    AccountDataAccessHelper 
{ 
@Override 
@Transactional(propagation = Propagation.REQUIRED) 
public void saveOrUpdate(T dataObject) 
{ 
    try 
    { 
     Session session = getSessionProvider().getSession(); 
     session.saveOrUpdate(dataObject); 
    } 
    catch (HibernateException e) 
    { 
     String message = "Failed to batch save or update " + dataObject; 
     log.error(message, e); 
    } 
} 
@SuppressWarnings("unchecked") 
public <R extends T> List<R> list(Class<R> class1) 
{ 
    Asserts.assertNotNull("class1", class1); 
    try 
    { 
     return createCriteria(class1).setCacheable(true) 
       .setCacheRegion(getQueryCacheRegion()).list(); 
    } catch (HibernateException e) 
    { 
     String message = "Failed to get a list of" + class1; 
     log.error(message, e); 
     throw new DataAccessException(message, e); 
    } catch (RuntimeException e) 
    { 
     log.error(e.toString(), e); 
     throw new DataAccessException(e); 
    } 
} 

} 

私AccountDataAccesshelperは私apllicationcontext.xmlの設定次の次のインターフェイス

public interface DataAccessHelper<T> 
{ 
public Serializable save(T dataObject); 

public void saveOrUpdate(T dataObject); 

public void update(T dataObject); 

public void delete(T dataObject); 

public void evict(T dataObject); 

} 

を実装しています。私は何もコミットとの接続が正しく閉じられアレントので、私はエラーを取得する巨大なバッチではありません上記セッションMethodeのを使用する場合

public Session getSession() 
{ 
    getSessionFactory().openSession(); 
} 

を以下のように

<context:component-scan base-package="nl.response.webapp" /> 
<context:annotation-config /> 

    <!-- hibernate session factory --> 
<bean id="sessionFactory" class="nl.response.responseframework.app.ResponseAnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="mainDataSource" /> 
    <property name="hibernateProperties"> 
     <map> 
      <entry key="hibernate.session_factory_name" value="wtxwebapp" /> 
      <entry key="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory" /> 
      <entry key="hibernate.cache.query_cache_factory" 
       value="nl.response.responseframework.service.InvalidatableQueryCacheFactory" /> 
      <entry key="hibernate.cache.region.factory_class" 
       value="nl.response.wtxwebapp.core.hibernate.WtxWebAppEhCacheRegionFactory" /> 
      <entry key="hibernate.cache.region_prefix" value="hibernate-" /> 
      <entry key="hibernate.generate_statistics" value="false" /> 
      <entry key="hibernate.current_session_context_class" value="thread" /> 
      <entry key="hibernate.cache.use_structured_entries" value="true" /> 
      <entry key="hibernate.cache.use_query_cache" value="true" /> 
      <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     </map> 
    </property> 
</bean> 

    <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> 
     <property name="driverClass" ref="hibernate.connection.driver_class" /> 
     <property name="jdbcUrl" ref="hibernate.connection.url" /> 
     <property name="username" ref="hibernate.connection.username" /> 
     <property name="password" ref="hibernate.connection.password" /> 
     <property name="poolName" ref="hibernate.connection.username"/> 
     <property name="idleConnectionTestPeriodInMinutes" value="60" /> 
     <property name="idleMaxAgeInMinutes" value="240" /> 
     <property name="maxConnectionsPerPartition" value="50" /> 
     <property name="minConnectionsPerPartition" value="5" /> 
     <property name="partitionCount" value="2" /> 
     <property name="poolAvailabilityThreshold" value="10" /> 
     <property name="acquireIncrement" value="4" /> 
     <property name="statementsCacheSize" value="50" /> 
     <property name="releaseHelperThreads" value="3" /> 
     <property name="serviceOrder" value="LIFO" /> 
    </bean> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="mainDataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<tx:annotation-driven transaction-manager="txManager"/> 

セッションプロバイダがセッションを提供します。

私はgetSessionFactory.getCurrentSession()を使用すると私は何をしないのですのcreateCriteriaがアクティブなトランザクションなしで

有効ではありません、次のエラーに

を取得しますか?私は既にこの仕事を数日中にしようとしています。オプションから脱出しています。

+0

エンティティのリストを読み込んでいるときに「createCriteriaが有効でない」というエラーが表示される –

答えて

1

getSession()と呼ぶたびに新しいSessionが開かれています。

代わりにこれを試してみてください:

public Session getSession() { 
    SessionFactoryUtils.getSession(getSessionFactory(), true); 
} 

これは、オンデマンドで作成されたSpring管理Hibernateセッションを取得します、だけではなく、新しいものを毎回開くの。

OpenInViewSessionFilterなどを使用しないと、トランザクション内にいない限り、すべてのクエリに対して新しいセッションが作成されます。しかし今回は、Springが自動的に閉じます。

+0

+1私のDAOユニットテストで私の問題を解決しました。 – Brad

関連する問題