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.

I upgrading to hibernate4.3.11 also I am using spring.4.0 in my project.

I am loading the session factory and mapping resources by extending localsessionfactorybean method 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);
}

Is this above code is correct to create sessionfactory? I saw above way to create session factory and I am loading mappingresources in the same method. is that correct or not? also previously in hibernate3 we are loading mapping resources in getconfiguration method. which is deprecated in Hibernate4 so I thought to load mappingresources in the buildSessionFactory method only.

Also in google I got like if you add below property 'no hibernate session' error will go but it didn't worked for me. so please give other suggestions.

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

Code in hibernate 3 is to build sessionfactory and load 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 changed the cache regionfactory and change the transanctionmanager to hibernate 4.

I change above application context xml as

 <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>

Mainly I need to how to create sessionfactory and how to load mappingresources.

halfer
  • 19,824
  • 17
  • 99
  • 186
user3198259
  • 178
  • 3
  • 13

1 Answers1

0

Changed my localsessionfactorybean code like below. Then all mapping resources loaded properly. Previous in hibernate 3 configuration is loading all the mappings before sessionfactorybean loads. But in hiberate4 is not like that, you have to add the resources manually to localsessionfactory bean. Same thing I added it's worked. I thought setmappingresources is enough for load but you need addresource to localsessionfactory bean also.

dialectMappings = dialectMappingsLocator.locateDialectMappings(configuration);

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

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

After that i implemented proper nullsafeget and nullsafeset implemementaion, now our project is fully upgraded to hibernate 4.3.11. Finally we are able to add query hints to all my queries that helps force indexing to tables. Thanks to stackoverflow for help.

Darren Shewry
  • 10,179
  • 4
  • 50
  • 46
user3198259
  • 178
  • 3
  • 13