【问题标题】:Hibernate 4 + Spring : org.springframework.beans.factory.BeanCreationExceptionHibernate 4 + Spring:org.springframework.beans.factory.BeanCreationException
【发布时间】:2015-08-25 21:16:04
【问题描述】:

我目前正在使用 Hibernate4、Spring 和 JPA 进行一些实现,但我在创建 Bean 时遇到了一些麻烦。

在应用程序中,我们使用一个具有各自配置(C3p0 类、数据源、*hibernate.cfg.xml 和 applicationContext)的 SQL Server 数据库,它可以工作。

但是当我尝试配置另一个数据库 (PostgreSQL) 并使用 JUnit 对其进行测试时,似乎无法创建与 PostgreSQL 数据库的新连接。

但我验证了访问权限,它们在外部 dbview 程序中工作。请考虑以下几点:

堆栈跟踪:

Caused by:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'transactionManager' defined in class path resource [config/applicationContext.xml]: 
Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory';
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'sessionFactory' defined in class path resource [config/hibernate.cfg.xml]: Invocation of init method failed;
nested exception is java.lang.NullPointerException

我的hibernate.cfg.xml

<bean id="dataSourceFactory" class="com.package.myapplication.c3p0"> 
    <constructor-arg type="String" value="${driverClassName}"/>
    <constructor-arg type="String" value="${url}" />
    <constructor-arg type="String" value="${user}" />
    <constructor-arg type="String" value="${password}" />
</bean>
<bean id="dataSource" factory-bean="dataSourceFactory" factory-method="createDriverManagerDataSource"></bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                          org.hibernate.dialect.PostgreSQLDialect
                    </prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.c3p0.max_statements">50</prop> 
            <prop key="hibernate.c3p0.max_size">100</prop>
            <prop key="hibernate.c3p0.min_size">5</prop>
        </props>
    </property> 
    <property name="annotatedClasses">
        <list>
              <value>com.package.myapplication.EntityClass</value>
        </list>
    </property>  
</bean>

applicationContext.xml

<beans>
<context:property-placeholder location="classpath:/database/db.properties" />

 <context:annotation-config />
 <tx:annotation-driven />   

 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean>  
<import resource="classpath:/config/hibernate.cfg.xml" />
</beans> 

最后我使用以下标头来加载 applicationContext.xml

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:/config/applicationContext.xml")
@Transactional
public class UnitTest(){
....
}

应用程序是否可能无法处理多个连接(数据源)?还是有其他方法可以使它起作用?

【问题讨论】:

  • 您是否尝试在 transactionManager 定义之前在顶部导入 hibernate.cfg.xml ??
  • 添加完整的堆栈跟踪而不是 sn-p。错误的一件事是您定义了 hibernate.current_session_context_class 属性。删除它。另外,您为什么要使用工厂来创建数据源?为什么不简单地在xml中定义呢?

标签: java spring datasource hibernate-4.x


【解决方案1】:

如下更改您的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="sessionFactory"
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.package.myapplication" />
      <property name="hibernateProperties">
       <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.c3p0.max_statements">50</prop> 
            <prop key="hibernate.c3p0.max_size">100</prop>
            <prop key="hibernate.c3p0.min_size">5</prop>
       </props>
  </property>

并确保您是 Hibernate 4 依赖项:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

【讨论】:

  • 我试过但它不起作用我仍然收到错误,这是堆栈跟踪:java.lang.IllegalStateException: Failed to load ApplicationContext 原因:org.springframework.beans .factory.BeanCreationException:在类路径资源 [config/hibernate.cfg.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.NullPointerException
  • 你现在可以试试吗,我将SessionFactory 实现从 Hibernate 3 更改为 4。
  • 是的,我更新了我的代码,但单元测试仍然失败。 (使用相同的堆栈跟踪日志)
  • 希望你的类路径中有Hibernate 4 依赖项。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多