2

私は春のhibenrateアプリケーションに取り組んでいて、ある時点で立ち往生しています。サービスが1つしかないコントローラーは1つだけです。サービスはデータベース内のデータを更新し、更新されたIDをクライアントに返し、スレッドを開始します。

    final Template template = templateBL.getTemplateById(Long.valueOf(templateId));

    Long templateStatusId = templateBL.updateTemplateStatus(template);
    Thread thread = new Thread(templateBL.setTemplate(template, templateStatusId));
    thread.start();
    return templateStatusId;

thread.start()でこのエラーが発生します

Exception in thread "Thread-8" org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:297)
at org.hibernate.loader.Loader.doQuery(Loader.java:770)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2082)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:628)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1853)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:369)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)

Hibernateテンプレートの自動配線を使用していて、DAOレイヤーに@transactionalを適用しています。私の構成は次のとおりです。

 <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <!-- currently set to UPDATE -->
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
 <bean>
 <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
          <property name="sessionFactory" ref="sessionFactory" /> 
 </bean>

おそらくうまくいかない可能性があるものを取得していません。助けてください。

4

1 に答える 1

4

Hibernate セッションは広告セーフではなく、複数のスレッドで使用してはなりません。新しいスレッドを開始すると、この新しいスレッドはセッション ファクトリから新しいセッションを取得する必要があります。エンティティを新しいスレッドに渡す場合は、最初にセッションからエンティティを切り離す必要があります。

そうしないと、コードと同様に、遅延コレクションを初期化しようとすると、セッションからメソッドが呼び出されます。セッションが(最初のスレッドから)閉じられて例外が発生するか、閉じられませんが、2つのスレッド間でセッションが共有され、あらゆる種類のランダムな問題が発生します。

于 2013-02-04T13:03:45.683 に答える