Spring + Hibernate

Estou tentando fazer uma aplicacao usando spring com hibernate mas esta me retornando o erro abaixo:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.hibernate.LocalSessionFactoryBean] for bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/jdbc.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.hibernate.LocalSessionFactoryBean

meus arquivos seguem abaixo:

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"
		xmlns="http://java.sun.com/xml/ns/j2ee"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
		http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
		
	<servlet>
		<servlet-name>site</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>site</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>	
	
	<welcome-file-list>
		<welcome-file>
			index.jsp
		</welcome-file>
	</welcome-file-list>
  	
  	<listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/jdbc.xml</param-value>
    </context-param>

</web-app>

jdbc.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"
		xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

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

    <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        <property name="dataSource"><ref local="dataSource"/></property>
        <property name="mappingResources">
            <list>
                <value>/WEB-INF/Artistas.hbm.xml</value>
            </list>
        </property>
    </bean>
	
</beans>

Artistas.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.site.vo">

        <class name="Artistas" 
            table="Artistas">
                
                <id name="cod_artista">
                    <generator class="increment"/>
                </id>
                                
                <property name="nome_artista"/>
                
        </class>           

</hibernate-mapping>

Está faltando essa classe aí no classpath:
java.lang.ClassNotFoundException: org.springframework.orm.hibernate.LocalSessionFactoryBean

O JAR do spring está no classpath certinho ?

Consegui fazer alguns ajustes…agora nao esta mais dando akele erro…a aplicacao esta compilando normalmente, agora qndo abro a pagina index aparesse isso:

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:535)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:453)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


root cause 

java.lang.NullPointerException
	com.site.dao.CategoriasDAO.listar(CategoriasDAO.java:16)
	com.site.controller.IndexController.listaCategorias(IndexController.java:29)
	com.site.controller.IndexController.handleRequest(IndexController.java:21)
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:523)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:453)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

meus arquivos

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
 
 <!DOCTYPE hibernate-configuration PUBLIC
  	"-//Hibernate/Hibernate Configuration DTD//EN"
  	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
 <hibernate-configuration>
 
 	<session-factory>
 
     	<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  		<property name="connection.url">jdbc:mysql://localhost/site</property>
  		<property name="connection.username">root</property>
  		<property name="connection.password">root</property>
 		
 		<mapping resource="/com/site/hibernate/Categorias.hbm.xml"></mapping>		
 
 	</session-factory>
 	
 </hibernate-configuration>

Categorias.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.site.vo">

        <class name="CategoriasVO" 
            table="categorias">
                
                <id name="cod_categoria">
                    <generator class="increment"/>
                </id>
                                
                <property name="nome_categoria"/>
                
        </class>  

</hibernate-mapping>

CategoriasDAO.java

public class CategoriasVO extends HibernateDaoSupport  {

	public void salvar(CategoriasVO categorias) {
		getHibernateTemplate().save(categorias);
	}
	
	public Collection listar() {        
		return getHibernateTemplate().find("FROM categorias");   
	}
	
}

IndexController.java

public class IndexController implements Controller{

	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Collection lista = listaCategorias();
		request.setAttribute("lista", lista);
		return new ModelAndView("/pages/index.jsp");
	}
	
	public Collection listaCategorias() {
		Collection lista = new ArrayList();
		CategoriasDAO dao = new CategoriasDAO();
		lista = dao.listar();
		return lista;
	}
}
CategoriasDAO dao = new CategoriasDAO();

Nao instancie direto assim, mas sim injete ele, declare um bean.

[quote=fabiofalci]CategoriasDAO dao = new CategoriasDAO();

Nao instancie direto assim, mas sim injete ele, declare um bean.[/quote]

Exato. Se você está usando o suporte ao Hibernate do Spring, o seu DAO precisará que a configuração seja injetada através de IoC.

Crie um bean representando o DAO no applicationContext.xml, e depois injete a sessionFactory no DAO para que tudo funcione corretamente.

Se tiver dúvidas, coloque aqui que podemos te ajudar.

Tem como vc implementar isso no meu codigo acima? Estou iniciando em spring e nao tenho conhecimento…ja tentei fazer varios exemplos da net mas n consegui…se der pra vc fazer esse favor, fica mais facil estudar por ele…

Implementar no seu código fica complicado, mas posso te dar algumas dicas para você tentar aprender.

No applicationContext.xml você deve criar um bean apontando para seu DAO:

[code]





org.hibernate.dialect.MySQLDialect
true
20
75
180
100

<bean name="DAO" class="com.portaljava.dao.DAO">
	<property name="sessionFactory" ref="sessionFactory"/>
</bean>[/code]

Quando você for utilizar esse DAO numa action, por exemplo, você nunca deve instânciar essa classe “na mão”. Não é responsabilidade da action instânciar o DAO. Para tal, deixe o Spring injetar uma instância do DAO na action de forma bem transparente.

Para que o Spring possa injetar uma instância do DAO, é necessário criar um método set para para o DAO declarado na action:

[code]private DAO dao;

public void setDAO(DAO dao) {
this.dao = dao;
}[/code]

Através desse método set que o Spring injetará a instância do DAO. Existem outras formas de utilizar IoC mas não vou entrar em detalhes aqui.