Spring + Hibernate

6 respostas
D

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>

6 Respostas

G

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

O JAR do spring está no classpath certinho ?

D

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;
	}
}
F
CategoriasDAO dao = new CategoriasDAO();

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

G

fabiofalci:
CategoriasDAO dao = new CategoriasDAO();

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

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.

D

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…

G

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:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
	    <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
           	<props>
	   			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="c3p0.min_size">20</prop>
				<prop key="c3p0.max_size">75</prop>
				<prop key="c3p0.timeout">180</prop>
				<prop key="c3p0.c3p0.idle_test_period">100</prop>
        </property>
    </bean>

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

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:

private DAO dao;

public void setDAO(DAO dao) {
   this.dao = dao;
}

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.

Criado 28 de março de 2008
Ultima resposta 31 de mar. de 2008
Respostas 6
Participantes 3