2013-08-13 5 views
1

Я использую Spring с Hibernate и первоначально настроил свой проект with a hibernate xml config, что привело к проблемам с производительностью и показалось, что это был неправильный способ сделать это. Теперь я пытаюсь ввести свой SessionFactory, начиная с 1 dao, но получаю исключение с нулевым указателем, в котором вызывается sessionFactory.getCurrentSession(). Я думаю, что мой код выглядит как примеры, которые я видел. Я в тупике. Я также пытался не использовать ресурс и вместо этого вводить sessionFactory в dao в контексте приложения. Тот же результат.SessionFactory is null

applicationContext.xml

<context:component-scan base-package="path.to.base"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingDirectoryLocations"> 
     <list> 
      <value>classpath*:/path/to/mapping/files</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<tx:annotation-driven/> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

myDAO

@Repository 
public class myDAO { 
private SessionFactory sessionFactory; 

public SessionFactory getSessionFactory(){ 
    return sessionFactory; 
} 

@Resource(name="sessionFactory") 
public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

public myDAO() { 

} 

@SuppressWarnings("unchecked") 
@Transactional(readOnly=true) 
public List<Things> getAllThings() { 
    return sessionFactory.getCurrentSession().createCriteria(EvalMasterEvaluationType.class) 
      .add(Restrictions.eq("active", "Y")).addOrder(Order.desc("createDtTm")).list(); 

} 

}

Spring 3.2.1, Hibernate 3.6.10

+0

Источник данных не установлен должным образом –

+1

я наткнулся на похожий вопрос. это связано с тем, что источник данных не установлен правильно –

+0

Я не думаю, что это все. Я не пропускаю никаких свойств в моем источнике данных, и я знаю, что драйвер, URL-адрес, имя пользователя и пароль верны. Я пробовал разные классы, но это не помогло. Однако это может быть что-то вне этих файлов. –

ответ

0

Я получил это работает, хотя я не уверен, какая модификация решила проблему. SRT_KP может быть прав в конце концов о источнике данных, так как я добавил к нему некоторые свойства (maxactive, maxidle, validationquery). Я переключился на LocalSessionFactoryBean, так как я использую сопоставления xml и добавил суффикс файла отображения к свойству mappingLocations. Я также переместил @Transactional на уровень сервиса, где он принадлежит.

Вот что я закончил с:

<?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:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

<context:property-placeholder location="classpath*:WEB-INF/*.properties"/> 
<context:component-scan base-package="org.base.to.scan"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 



<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="oraDataSource" /> 
    <property name="mappingLocations" value="classpath*:org/path/to/mapping/files/*.hbm.xml" /> 
</bean> 

<bean id="oraDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="maxActive" value="10" /> 
    <property name="maxIdle" value="5" /> 
    <property name="validationQuery" value="SELECT 'x' FROM dual" /> 
</bean> 

<tx:annotation-driven/> 

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

BTW большого обучающий: http://www.byteslounge.com/tutorials/spring-with-hibernate-persistence-and-transactions-example