2015-10-20 4 views
0

У меня есть проблема о интеграции Hibernate с Spring:Hibernate интеграции с Spring

Мой hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">123456</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/CODEL</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.current_session_context_class"> 
      org.springframework.orm.hibernate4.SpringSessionContext 
     </property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <mapping resource="com/model/Contact.hbm.xml" /> 
    </session-factory> 
</hibernate-configuration> 

Мои applicationContext.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-2.5.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 

    <bean id="contactdao" class="com.dao.ContactDAO" scope="prototype" /> 
    <bean id="userdao" class="com.dao.UserDAO" scope="prototype" /> 
    <bean id="groupdao" class="com.dao.GroupDAO" scope="prototype" /> 


    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
     <property name="url" value="jdbc:mysql://localhost:3306/CODEL"></property> 
     <property name="username" value="root"></property> 
     <property name="password" value="123456"></property> 
    </bean> 

    <bean id="mySessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="configLocation"> 
      <!-- chemin vers le fichier hibernate de config. ça évite d'avoir un composant 
       datasource --> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
    </bean> 
    <tx:advice id="txAdvice"> 
     <tx:attributes> 
      <tx:method name="get*" read-only="true" timeout="-1" /> 
      <tx:method name="sav*" propagation="REQUIRED" /> 
      <tx:method name="find*" read-only="true" /> 
     </tx:attributes> 
    </tx:advice> 
    <aop:config> 
     <aop:advisor pointcut="execution(* com.dao.ContactDAO.*(..))" 
      advice-ref="txAdvice" /> 
    </aop:config> 

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

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> 
     <property name="sessionFactory" ref="mySessionFactory"></property> 
     <property name="checkWriteOperations" value="false" /> 
    </bean> 

    <bean id="contactDAO" class="com.dao.ContactDAO"> 
     <property name="hibernateTemplate" ref="hibernateTemplate" /> 
    </bean> 
</beans> 

Мой дао

import java.util.List; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.orm.hibernate4.HibernateTemplate; 
import org.springframework.orm.hibernate4.support.HibernateDaoSupport; 

import com.model.Contact; 
import com.model.Entreprise; 
import com.model.PhoneNumber; 
import com.util.HibernateUtil; 

public class ContactDAO extends HibernateDaoSupport { 
    private HibernateTemplate hibernateTemplate; 

    public ContactDAO() { 
    } 

    public void setHibernateTemplate(SessionFactory sessionFactory) { 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
    } 

    public List<Contact> listAllContacts() { 
     List<Contact> listContacts = (List<Contact>) this.hibernateTemplate 
       .find("from CODEL.Contact"); 
     return listContacts; 
    } 
} 

I ' ve получил ошибку NullPointerException в строке this.hibernateTemplate.find ... По println, я видел его null. Спасибо за любое предложение и объяснение, почему мой код вызвал эту ошибку.

ответ

0

Может ли вы обновить метод ContactDAO setHibernateTemplate для установки hibernateTemplate, вместо создания нового HibernateTemplate, например

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { 
    this.hibernateTemplate = hibernateTemplate; 
} 

В настоящее время вашего метод сеттера принимает SessionFactory, поэтому его не вызывая фактические сеттеров для спящего режима шаблон, который может вызвать исключение нулевого указателя.

+0

нет, я не могу перезаписать метод HibernateDaoSupport –

+0

, почему вам нужен этот метод? вы не можете просто удалить его. – asit

+0

или просто измените свой this.hibernateTemplate на getHibernateTemplate(), чтобы он мог получить hibernateTemplate из HibernateDaoSupport. – asit

0

Предположим, вы должны сказать весне, как разные компоненты общаются между ними. Вам нужны аннотации, чтобы связать их вместе. Самый простой способ - позволить Spring самостоятельно обнаруживать эти ссылки. Так в applicationContext.xml, добавьте следующую строку кода:

<context:component-scan base-package="com.example.pkg" /> 

Тогда весна будет искать каждый компонент в этом пакете. Вам также нужно объявить о существовании ваших коммоентов.

@Repository(value = "contactDAO") 
public class ContactDAO extends HibernateDaoSupport 

И вы должны связать компонент, созданный в контексте вашего класса attribut:

@Autowired 
private HibernateTemplate hibernateTemplate; 

Затем вы можете использовать этот объект HibernateTemplate без setMethod, потому что инициализация завершена к весне.