2013-08-13 6 views
1

J'utilise Spring avec Hibernate et j'ai initialement créé mon projet with a hibernate xml config, ce qui a entraîné des problèmes de performances et semblait être la mauvaise façon de procéder. J'essaye maintenant d'injecter mon SessionFactory, en commençant par 1 dao, mais obtenez une exception null de pointeur où sessionFactory.getCurrentSession() est appelée. Je pense que mon code ressemble aux exemples que j'ai vus. Je suis perplexe. J'ai également essayé de ne pas utiliser la ressource et d'injecter la sessionFactory dans le dao dans le contexte de l'application à la place. Même résultatSessionFactory 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

source de données ne sont pas correctement réglée –

+1

j'avais rencontré question similaire. c'était parce que la source de données n'était pas réglée correctement –

+0

Je ne pense pas que ce soit ça. Je ne manque aucune propriété dans ma source de données et je sais que le pilote, l'url, le nom d'utilisateur et le mot de passe sont corrects. J'ai essayé différentes classes, mais cela n'a pas aidé. Il se peut que ce soit quelque chose en dehors de ces fichiers. –

Répondre

0

Je l'ai travail, bien que je ne suis pas Assurez-vous quelle modification a résolu le problème. SRT_KP pourrait être juste après tout au sujet de la source de données puisque j'ai ajouté quelques propriétés à elle (maxactive, maxidle, validationquery). Je suis passé à LocalSessionFactoryBean car j'utilise des mappages xml et ajouté le suffixe du fichier de mappage à la propriété mappingLocations. J'ai également déplacé @Transactional vers la couche de service à laquelle elle appartient.

Voici ce que j'ai fini avec:

<?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 grand tutoriel: http://www.byteslounge.com/tutorials/spring-with-hibernate-persistence-and-transactions-example