0
        2016-01-28 12:27:46.433 3a37210f D 00000000000000000000000000000000    002e:Could not retrieve pre-bound Hibernate session  "org.hibernate.HibernateException: No Session found for current thread
            at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
            at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
            at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:325)
            at org.springframework.orm.hibernate4.HibernateTemplate.execute(HibernateTemplate.java:295)
            at com.fusionone.pml.dao.hibernate.AbstractDao.executeCallback(AbstractDao.java:398)
            at com.fusionone.pml.dao.hibernate.AbstractDao.listInner(AbstractDao.java:300)
            at com.fusionone.pml.dao.hibernate.AbstractDao.list(AbstractDao.java:262)
            at com.fusionone.pml.dao.hibernate.ExtShareDaoImpl.listExpiredShares(ExtShareDaoImpl.java:63)
            at com.fusionone.nab.apps.service.impl.ExtShareServiceImpl.listExpiredShares(ExtShareServiceImpl.java:628)
            at com.fusionone.wsg.nab.scheduler.ExtShareExpiredScheduler.cleanup(ExtShareExpiredScheduler.java:111)
            at com.fusionone.wsg.nab.scheduler.ExtShareExpiredScheduler.execute(ExtShareExpiredScheduler.java:99)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:269)
            at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:321)
            at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:111)
            at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
            at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
        "
        2016-01-28 12:27:46.441 3a37210f D 00000000000000000000000000000000    000b:F1Exception  "8 SQL Error  (Named query not known: ExtShare.find_all_shares_expired; nested exception is org.hibernate.MappingException: Named query not known: ExtShare.find_all_shares_expired)
            at com.fusionone.pml.dao.hibernate.AbstractDao.executeCallback(AbstractDao.java:400)
            at com.fusionone.pml.dao.hibernate.AbstractDao.listInner(AbstractDao.java:300)
            at com.fusionone.pml.dao.hibernate.AbstractDao.list(AbstractDao.java:262)
            at com.fusionone.pml.dao.hibernate.ExtShareDaoImpl.listExpiredShares(ExtShareDaoImpl.java:63)
            at com.fusionone.nab.apps.service.impl.ExtShareServiceImpl.listExpiredShares(ExtShareServiceImpl.java:628)
            at com.fusionone.wsg.nab.scheduler.ExtShareExpiredScheduler.cleanup(ExtShareExpiredScheduler.java:111)
            at com.fusionone.wsg.nab.scheduler.

プロジェクトで spring.4.0 を使用しています。

localsessionfactorybean メソッド buildsessionfactorymethod を拡張して、セッション ファクトリとマッピング リソースをロードしています。

    @Override
        protected  SessionFactory buildSessionFactory(LocalSessionFactoryBuilder localSessionFactoryBuilder){
            SessionFactory sessionFactory = null;
            PMLDialectMappings dialectMappings = null;
             String[] mappingResources = null;
            try {

                Configuration configuration = new Configuration();
                            // building mappingLocations

    Configuration configuration = new Configuration();
                            // building mappingLocations
                 dialectMappings =
                        dialectMappingsLocator.locateDialectMappings(configuration);
                if (dialectMappings != null) {
                    setMappingResources(dialectMappings.getAllMappingResources());
                    AbstractDao.setDialectSettings(dialectMappings);
                }

        ServiceRegistry  builder =  new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
                sessionFactory = configuration.buildSessionFactory(builder);

    String schema = configuration.getProperty("hibernate.default_schema");


            return super.buildSessionFactory(localSessionFactoryBuilder);
}

この上記のコードは、sessionfactory を作成するのに正しいですか? セッション ファクトリを作成する上記の方法を見ましたが、同じ方法でマッピング リソースをロードしています。それは正しいですか?また、以前の hibernate3 では、getconfiguration メソッドでマッピング リソースをロードしています。これは Hibernate4 で非推奨になったため、buildSessionFactory メソッドでのみマッピング リソースをロードすると考えました。

また、Googleでは、プロパティの下に「休止状態セッションなし」エラーを追加すると、うまくいきませんでした。だから他の提案をしてください。

hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

hibernate 3 のコードは、sessionfactory をビルドして mappingresource をロードすることです

@Override
    protected SessionFactory newSessionFactory(Configuration config) {
        try {
            String schema = config.getProperty("hibernate.default_schema");
            if (schema != null && schema.length() > 0) {
                AbstractDao.setSchemaName(schema);
            } else {
                Logger.get(Constants.PML_LOGGER).warning(
                    "Property 'hibernate.default_schema' not set: using default");
            }
        } catch (Throwable t) {
            Logger.get(Constants.PML_LOGGER).exception(LogType.CRITICAL, null, null,
                "PMLSessionFactoryBean: newSessionFactory method failed", t);
            throw new HibernateException(t.getMessage());
        }
        return super.newSessionFactory(config);
    }

    /**
     * @return Configuration
     * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#newConfiguration()
     */
    @Override
    protected Configuration newConfiguration() {
        Configuration configuration = super.newConfiguration();
        // building mappingLocations
        PMLDialectMappings dialectMappings =
            dialectMappingsLocator.locateDialectMappings(configuration);
        if (dialectMappings != null) {
            setMappingResources(dialectMappings.getAllMappingResources());
            AbstractDao.setDialectSettings(dialectMappings);
        }
        return configuration;
    }

}


application-context.xml 
*********************
 <bean id="PMLJdbcProperties" class="com.fusionone.core.util.FilteredProperties">
        <property name="location" value="classpath:jdbc.properties" />
        <constructor-arg value="pml" />
    </bean>
    <bean id="PMLDataSource"
        class="com.fusionone.core.db.pool.MonitoredDataSourceFactory"
        destroy-method="close" factory-method="createDataSource">
        <constructor-arg ref="PMLJdbcProperties" />
    </bean>
    <bean id="PMLDefaultDialectSettings" class="com.fusionone.pml.bean.PMLDialectMappings"
        lazy-init="true" autowire-candidate="false">
        <property name="mappingResources">
            <list>
                <value>hibernate-mappings/BrewApp.hbm.xml</value>
                <value>hibernate-mappings/Contact.hbm.xml</value>
                <value>hibernate-mappings/DeletedContact.hbm.xml</value>
                <value>hibernate-mappings/DeletedContactGroup.hbm.xml</value>
</list>
</property>

        <property name="daoInterfaceImpls">
            <map>
                <entry key="DeletedContactDao"
                    value="com.fusionone.pml.dao.hibernate.DeletedContactDaoImpl" />
                <entry key="DeletedContactGroupDao"
                    value="com.fusionone.pml.dao.hibernate.DeletedContactGroupDaoImpl" />
</map>
</property>

    <bean id="dialectMappingsLocator" class="com.fusionone.pml.bean.DialectMappingsLocator"
        autowire="byType">
    </bean>
    <bean id="PMLSessionFactory" class="com.fusionone.pml.bean.PMLSessionFactoryBean">
        <property name="dataSource">
            <ref bean="PMLDataSource" />
        </property>
        <property name="dialectMappingsLocator" ref="dialectMappingsLocator" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.jdbc.use_get_generated_keys">
                    false
                </prop>
                <prop key="hibernate.cache.provider_class">
                    net.sf.ehcache.hibernate.EhCacheProvider
                </prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.jdbc.batch_size">150</prop>
            </props>
        </property>
    </bean> 

<tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="PMLSessionFactory" />
        </property>
        <property name="nestedTransactionAllowed" value="true" />
    </bean>

Hibernate 4 は、キャッシュの regionfactory を変更し、transanctionmanager を hibernate 4 に変更しました。

上記のアプリケーションコンテキストxmlを次のように変更します

 <bean id="PMLJdbcProperties" class="com.fusionone.core.util.FilteredProperties">
        <property name="location" value="classpath:jdbc.properties" />
        <constructor-arg value="pml" />
    </bean>
    <bean id="PMLDataSource"
        class="com.fusionone.core.db.pool.MonitoredDataSourceFactory"
        destroy-method="close" factory-method="createDataSource">
        <constructor-arg ref="PMLJdbcProperties" />
    </bean>
    <bean id="PMLDefaultDialectSettings" class="com.fusionone.pml.bean.PMLDialectMappings"
        lazy-init="true" autowire-candidate="false">
        <property name="mappingResources">
            <list>
                <value>hibernate-mappings/BrewApp.hbm.xml</value>
                <value>hibernate-mappings/Contact.hbm.xml</value>
                <value>hibernate-mappings/DeletedContact.hbm.xml</value>
                <value>hibernate-mappings/DeletedContactGroup.hbm.xml</value>
</list>
</property>

        <property name="daoInterfaceImpls">
            <map>
                <entry key="DeletedContactDao"
                    value="com.fusionone.pml.dao.hibernate.DeletedContactDaoImpl" />
                <entry key="DeletedContactGroupDao"
                    value="com.fusionone.pml.dao.hibernate.DeletedContactGroupDaoImpl" />
</map>
</property>

    <bean id="dialectMappingsLocator" class="com.fusionone.pml.bean.DialectMappingsLocator"
        autowire="byType">
    </bean>
    <bean id="PMLSessionFactory" class="com.fusionone.pml.bean.PMLSessionFactoryBean">
        <property name="dataSource">
            <ref bean="PMLDataSource" />
        </property>
        <property name="dialectMappingsLocator" ref="dialectMappingsLocator" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.jdbc.use_get_generated_keys">
                    false
                </prop>
                <prop key="hibernate.cache.region.provider_class">
                org.hibernate.cache.ehcache.EhCacheRegionFactory
            </prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.jdbc.batch_size">150</prop>
            </props>
        </property>
    </bean> 

<tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="PMLSessionFactory" />
        </property>
        <property name="nestedTransactionAllowed" value="true" />
    </bean>

主に、sessionfactory の作成方法と mappingresources のロード方法が必要です。

4

1 に答える 1

0

localsessionfactorybean以下のように私のコードを変更しました。次に、すべてのマッピング リソースが正しく読み込まれました。以前の hibernate 3 構成では、ロード前にすべてのマッピングをsessionfactorybeanロードしています。しかし、hiberate4 ではそうではなく、リソースを手動でlocalsessionfactoryBean に追加する必要があります。私が追加したのと同じことがうまくいきました。ロードには十分だと思いましたが、ビーンもsetmappingresources必要です。addresourcelocalsessionfactory

dialectMappings = dialectMappingsLocator.locateDialectMappings(configuration);

if (dialectMappings != null) {
    setMappingResources(dialectMappings.getAllMappingResources());
    AbstractDao.setDialectSettings(dialectMappings);
}

for(String resource : dialectMappings.getParentDialectMappings().getAllMappingResources()) {
    configuration.addResource(resource);
}

その後、適切な実装を実装し、現在、プロジェクトは休止状態nullsafegetnullsafeset4.3.11 に完全にアップグレードされています。最後に、すべてのクエリにクエリ ヒントを追加して、テーブルへのインデックス作成を強制することができます。助けてくれたstackoverflowに感謝します。

于 2016-02-07T07:00:44.897 に答える