2016-01-28 4 views
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. 

Je mise à niveau vers hibernate4.3.11 aussi j'utilise spring.4.0 dans mon projet .la mise à niveau hibernate3 à hibernate4 aussi je l'ai fait tous les changements, mais je reçois « Impossible de récupérer avant la session Hibernate liée » exceptions dans les journaux

Je charge la fabrique de session et les ressources de mappage en étendant la méthode 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); 
} 

Est-ce que ce code est correct pour créer sessionfactory? J'ai vu au-dessus de la manière de créer l'usine de session et je charge des ressources de mapping dans la même méthode. Est-ce correct ou pas? aussi précédemment dans hibernate3 nous chargeons les ressources de mappage dans la méthode getconfiguration. ce qui est déprécié dans Hibernate4 donc j'ai pensé charger loadresources dans la méthode buildSessionFactory seulement.

Aussi dans google j'ai eu comme si vous ajoutez ci-dessous la propriété 'aucune session de hibernate' erreur ira mais cela n'a pas fonctionné pour moi. alors s'il vous plaît donner d'autres suggestions.

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

code en veille prolongée 3 est de construire mappingresource SessionFactory et la charge

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

Mise en veille prolongée 4 changé le cache regionfactory et changer le transanctionmanager hiberner 4.

je change ci-dessus contexte d'application 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> 

Principalement je dois h ow pour créer sessionfactory et comment charger mappingresources.

Répondre

0

J'ai modifié mon code localsessionfactorybean comme ci-dessous. Ensuite, toutes les ressources de mappage sont chargées correctement. Précédent dans Hibernate 3 configuration est le chargement de tous les mappings avant charges sessionfactorybean. Mais dans hiberate4 n'est pas comme ça, vous devez ajouter les ressources manuellement au bean localsessionfactory. La même chose que j'ai ajouté c'est travaillé. Je pensais que setmappingresources est suffisant pour la charge, mais vous avez besoin de à localsessionfactory haricot aussi.

dialectMappings = dialectMappingsLocator.locateDialectMappings(configuration); 

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

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

Après que je mis en œuvre correcte et nullsafegetnullsafeset implemementaion, maintenant notre projet est entièrement mis à niveau pour hiberner 4.3.11. Enfin, nous sommes en mesure d'ajouter des conseils de requête à toutes mes requêtes, ce qui permet de forcer l'indexation des tables. Merci à stackoverflow pour l'aide.