来自hibernate的UnknownServiceException

时间:2015-10-22 12:36:15

标签: java spring hibernate

我正在使用Spring 4来设置我使用Hibernate 4所需的东西。我在我的DAO层中有一个SessionFactory自动装配。当我致电sessionFactory.getCurrentSession()时,我收到错误:

Exception in thread "MyImporterThread" org.hibernate.service.UnknownServiceException:  Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

我在这个例外中查看过Google的许多搜索结果(包括StackOverflow中的一些搜索结果),但是没有一个能让我感到震惊,因为我解决了这个问题。

这是我的配置:

弹簧-beans.xml文件:

<context:property-placeholder location="file:spring.properties" />
<context:component-scan base-package="com.company.scraping" />

<!-- Data Source -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver.class}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.company.scraping" />
    <property name="configLocation">
        <value>file:scraping.db.hibernate.cfg.xml</value>
    </property>
</bean>

<!-- Transaction Stuff -->
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- beans that are transactional or autowired -->
<bean id="scrapingDao" class="com.company.scraping.dao.ReportsScrapingDaoImpl" />
<bean id="scrapingService" class="com.company.scraping.service.ReportsScrapingServiceImpl" />

spring.properties:

jdbc.driver.class=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@server:1521:testdb01
jdbc.user=user
jdbc.password=password

scraping.db.hibernate.cfg.xml:

<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:oracle:thin:@server:1521:testdb01</property>
        <property name="connection.username">user</property>
        <property name="connection.password">password</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.autocommit">true</property>
        <property name="hibernate.generate_statistics">false</property>
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.show_sql">false</property>
    </session-factory>
</hibernate-configuration>

由于这不是一个Web应用程序,我使用ApplicationContext context = new FileSystemXmlApplicationContext(args[0])初始化Spring。

我的服务类是自动装配的(未在配置中显示,因为我必须输入所有这些),并包含DAO的自动装配实例。这就是DAO的样子:

@org.springframework.stereotype.Repository
@org.springframework.transaction.annotation.Transactional
public class ReportsScrapingDaoImpl implements ReportsScrapingDao 
{
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    @Override
    @Transaction(readOnly = true)
    public List<Stuff> getAll()
    {
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Stuff.class);
        ... (more code)
    }
}

代码在调用sessionFactory.getCurrentSession()时爆炸。我也尝试过使用sessionFactory.openSession(),但它也给出了相同的结果。我不确定这里发生了什么。

1 个答案:

答案 0 :(得分:0)

我做了最后一次搜索并且this出现了。 Eclipse输出编译器警告,抱怨可能存在资源泄漏,因为ApplicationContext从未关闭。我在main方法的最后添加了一行(在所有Threads启动后)以关闭ApplicationContext。一旦我摆脱关闭ApplicationContext的线,问题就消失了。

故事的道德是你的ApplicationContext不应该被关闭,直到你不再需要任何东西 - 所以你可能永远不会关闭它。