【发布时间】: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