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方法buildsessionfactory方法来映射资源。
@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?我在上面看到了创建会话工厂的方法,我在同一个方法中加载mappingresources。这是正确与否?以前在hibernate3中我们也在getconfiguration方法中加载映射资源。在Hibernate4中不推荐使用,所以我想只在buildSessionFactory方法中加载mappingresources。
同样在谷歌我觉得如果你添加下面的属性'没有hibernate会话'错误将去,但它不适合我。所以请提出其他建议。
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
hibernate 3中的代码是构建sessionfactory和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更改了缓存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。
答案 0 :(得分:0)
更改了我的localsessionfactorybean
代码,如下所示。然后正确加载所有映射资源。 hibernate 3配置中的前一个配置是在加载sessionfactorybean
之前加载所有映射。但是在hiberate4不是那样的,你必须手动将资源添加到localsessionfactory
bean。同样的事情我添加了它的工作。我认为setmappingresources
足以加载,但您也需要addresource
到localsessionfactory
bean。
dialectMappings = dialectMappingsLocator.locateDialectMappings(configuration);
if (dialectMappings != null) {
setMappingResources(dialectMappings.getAllMappingResources());
AbstractDao.setDialectSettings(dialectMappings);
}
for(String resource : dialectMappings.getParentDialectMappings().getAllMappingResources()) {
configuration.addResource(resource);
}
之后我实现了正确的nullsafeget
和nullsafeset
实现,现在我们的项目完全升级到hibernate 4.3.11。最后,我们可以向所有查询添加查询提示,以帮助强制索引表。感谢stackoverflow的帮助。