Я обновляю hibernate3 до hibernate4, также я сделал все изменения, но я получаю в журналах исключения «Не удалось получить предварительно привязанный сеанс Hibernate».

        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.

Я обновляюсь до hibernate4.3.11 и использую 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

Код в спящем режиме 3 предназначен для создания сеансовой фабрики и загрузки ресурса сопоставления.

@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 изменил регион кеша и изменил диспетчер транзакций на 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 и как загрузить ресурсы сопоставления.


person user3198259    schedule 28.01.2016    source источник


Ответы (1)


Изменил мой код localsessionfactorybean, как показано ниже. Затем все ресурсы сопоставления загружаются правильно. Предыдущая конфигурация в спящем режиме 3 загружает все сопоставления до загрузки sessionfactorybean. Но в hiberate4 это не так, вам нужно вручную добавлять ресурсы в localsessionfactory bean. То же самое, что я добавил, это сработало. Я думал, что setmappingresources достаточно для загрузки, но вам также нужен bean-компонент от addresource до localsessionfactory.

dialectMappings = dialectMappingsLocator.locateDialectMappings(configuration);

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

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

После этого я правильно реализовал nullsafeget и nullsafeset, теперь наш проект полностью обновлен до спящего режима 4.3.11. Наконец, мы можем добавлять подсказки ко всем моим запросам, что помогает принудительно индексировать таблицы. Спасибо stackoverflow за помощь.

person user3198259    schedule 07.02.2016