DAO com Hibernate

Boa tarde!

Estou desenvolvendo uma pequena aplicacao no Eclipse que se resume no seguinte:

Uma pagina JSP que coleta tres entradas de texto envia para uma servlet que instancia uma entidade para receber essas tres entradas, passa essa entidade para a DAO que deve conectar com o banco mySQL usando hibernate e criteria para persistir os dados.

Sou iniciante em programacao e dei uma travada na DAO. Consegui fazer a pagina JSP, a entidade e a servlet, conforme abaixo:

demo.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Demonstração Final</title>
</head>
<body>
<div style="text-align: center">
<form id="formularioDemo" action="Demo?method=capturaParametros" method="post">
Entrada 1<input name="entrada1" type="text"><br />
Entrada 2<input name="entrada2" type="text"><br />
Entrada 3<input name="entrada3" type="text"><br /><br />
<input value="Enviar" type="submit">
</form>
</div>
</body>
</html>

DemoTO


public class Demo {
	private Object entrada1;
	private Object entrada2;
	private Object entrada3;
	
	public void setEntrada1(Object entrada1){
		this.entrada1 = entrada1;
	}

	public Object getEntrada1(){
		return entrada1;
	}
	
	public void setEntrada2(Object entrada2){
		this.entrada2 = entrada2;
	}
	
	public Object getEntrada2(){
		return entrada2;
	}	
	
	public void setEntrada3(Object entrada3){
		this.entrada3 = entrada3;
	}	
	
	public Object getEntrada3(){
		return entrada3;
	}	
}

DemoServlet


import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import fpu.buffet.dao.DemoDAO;
import fpu.buffet.to.Demo;

public class DemoServlet extends HttpServlet {
	
	public void capturaParametros(HttpServletRequest request,HttpServletResponse response) throws ServerException, IOException, ServletException   {   
	
	String entrada1 = request.getParameter("entrada1");
	String entrada2 = request.getParameter("entrada2");
	String entrada3 = request.getParameter("entrada3");
	
	Demo myDemo = new Demo();
	
	myDemo.setEntrada1(entrada1);
	myDemo.setEntrada2(entrada2);
	myDemo.setEntrada3(entrada3);
	
	DemoDAO myDemoDAO = new DemoDAO();

	
	}	
}

Gostaria de ajuda para desenvolver a DAO com hibernate e criteria para inserir os dados no banco.

Alguem poderia me ajudar?

Cara… se você só vai “gravar” os dados no banco, não precisa de Criteria.
A API Criteria é direcionada a buscas.

Pra aprender a usar o Hibernate, aqui no GUJ mesmo tem uns artigos legais:
http://www.guj.com.br/article.show.logic?id=125
http://www.guj.com.br/article.show.logic?id=174

[quote=Filipe Chagas]Cara… se você só vai “gravar” os dados no banco, não precisa de Criteria.
A API Criteria é direcionada a buscas.

Pra aprender a usar o Hibernate, aqui no GUJ mesmo tem uns artigos legais:
http://www.guj.com.br/article.show.logic?id=125
http://www.guj.com.br/article.show.logic?id=174[/quote]

Vlw irmão!

Vou estudar esses tutoriais aqui e posto dúvidas se surgirem…

public class ClienteDAOIMPL extends HibernateGenericDAO<Cliente, Long> implements ClienteDAO {

Alguem pode me explicar o que esse trecho de codigo quer dizer?

eu sei que a classe ClienteDAOIML estah herdando os metodos e atributos de HibernateGenericDAO e deve implementar os metodos da classe ClienteDAO.

Mas o que significa “<Cliente, Long>”?

quer dizer que ClienteDAOIMPL irá ser um dao para entidades do tipo Cliente, com chave primária do tipo Long.

Isto é assim pq na definição do HibernateGenericDAO, ele foi construido usando Generics (HibernateGenericDAO <T,K>, por exemplo). da uma olhada nestes links pra vc entender melhor:

http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
http://www.plugmasters.com.br/sys/materias/864/1/Tipos-gen%E9ricos-em-Java-%28Generics%29

[quote=mario.fts]quer dizer que ClienteDAOIMPL irá ser um dao para entidades do tipo Cliente, com chave primária do tipo Long.

Isto é assim pq na definição do HibernateGenericDAO, ele foi construido usando Generics (HibernateGenericDAO <T,K>, por exemplo). da uma olhada nestes links pra vc entender melhor:

http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
http://www.plugmasters.com.br/sys/materias/864/1/Tipos-gen%E9ricos-em-Java-%28Generics%29[/quote]

Vlw Mario!

E Generics que eu precisavo estudar…

Achei uma introducao bacana em http://www.tiexpert.net/programacao/java/generics.php tambem.

(Continuo construindo minha DAO, volto aqui em caso de novas duvidas)

Pessoal, depois de muito custo acho que consegui fazer o que eu queria, ficou assim:

Inicialmente tenho um formulario que coleta três entradas:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Demonstração Final</title>
</head>
<body>
<div style="text-align: center">
<form id="formularioDemo" action="Demo" method="post">
Entrada 1<input name="entrada1" type="text"><br />
Entrada 2<input name="entrada2" type="text"><br />
Entrada 3<input name="entrada3" type="text"><br /><br />
<input value="Enviar" type="submit">
</form>
</div>
</body>
</html>

Depois tenho as servlet que recebe a requisição do formulário:

package fpu.buffet.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import fpu.buffet.dao.DemoDAO;
import fpu.buffet.to.Demo;

public class DemoServlet extends HttpServlet {
	
	protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServerException, IOException, ServletException   {   
	
	String entrada1 = request.getParameter("entrada1");
	String entrada2 = request.getParameter("entrada2");
	String entrada3 = request.getParameter("entrada3");
	
	Demo myDemo = new Demo();
	
	myDemo.setEntrada1(entrada1);
	myDemo.setEntrada2(entrada2);
	myDemo.setEntrada3(entrada3);
	
	DemoDAO myDemoDAO = new DemoDAO();
	myDemoDAO.persisteDemo(myDemo);	
	
	}	
}

A entidade Demo está assim:

package fpu.buffet.to;

public class Demo {
	private Object entrada1;
	private Object entrada2;
	private Object entrada3;
	
	public void setEntrada1(Object entrada1){
		this.entrada1 = entrada1;
	}

	public Object getEntrada1(){
		return entrada1;
	}
	
	public void setEntrada2(Object entrada2){
		this.entrada2 = entrada2;
	}
	
	public Object getEntrada2(){
		return entrada2;
	}	
	
	public void setEntrada3(Object entrada3){
		this.entrada3 = entrada3;
	}	
	
	public Object getEntrada3(){
		return entrada3;
	}	
}

DemoDAO ficou assim:

package fpu.buffet.dao;

import org.hibernate.*;

import fpu.buffet.dao.hibernate.HibernateUtility;
import fpu.buffet.to.Demo;


public class DemoDAO {
	
	public void persisteDemo(Object presiste){
		
		Session sessao = HibernateUtility.getSession(); //Abrindo uma sessão
		
		Transaction transaction = sessao.beginTransaction(); //Iniciando uma transação


		sessao.save(presiste); //Transformando o objeto transiente em um objeto persistente no banco de dados
		
		transaction.commit(); //Finalizando a transação
		
		sessao.close(); //Fechando a sessão
	}

}

HibernateUtility para iniciar a sessão:

package fpu.buffet.dao.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {
	private static SessionFactory factory;

	static {

		try {

			factory = new Configuration().configure().buildSessionFactory();

		} catch (Exception e) {

			e.printStackTrace();

			factory = null;
		}
	}

	public static Session getSession() {

		return factory.openSession();
	}
}

O problema é que quando rodo o trem dá erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
	fpu.buffet.dao.hibernate.HibernateUtility.getSession(HibernateUtility.java:26)
	fpu.buffet.dao.DemoDAO.persisteDemo(DemoDAO.java:12)
	fpu.buffet.controller.DemoServlet.doPost(DemoServlet.java:30)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20

Alguém, por favor, consegue me ajudar a resolver o problema acima?

da uma olhada na inicialização do sistema, se num tem nenhuma exceção lá, o seu factory deve estar null

Mario, nao entendi o que vc quis dizer…

Por favor, seja mais claro.

essa classe:

[code]package fpu.buffet.dao.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {
private static SessionFactory factory;

static {

	try {

		factory = new Configuration().configure().buildSessionFactory();

	} catch (Exception e) {

		e.printStackTrace();

		factory = null;
	}
}

public static Session getSession() {

	return factory.openSession();
}

}
[/code]

na hora que chama o getSession, o seu factory não está iniciado. coloca um break point, pra ver se ta nulo mesmo. deve estar ocorrendo algum erro na inicialização, do bloco estático, nesse ponto:

[code]

static {

	try {

		factory = new Configuration().configure().buildSessionFactory();

	} catch (Exception e) {

		e.printStackTrace();

		factory = null;
	}
}[/code]

coloca um breakpoint lá tbm, pra ver se o factory ta sendo iniciado, ou se ta dando erro

Fiz isso:

package fpu.buffet.dao.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {
	private static SessionFactory factory;

	static {

		try {

			factory = new Configuration().configure("./CSBuffet/src/hibernate.cfg.xml").buildSessionFactory();

		} catch (Exception e) {

			e.printStackTrace();

			factory = null;
		}
	}

	public static Session getSession() {

		return factory.openSession();
	}
}

O erro persiste…

Sou iniciante, nao estou familiarizado com a linguagem q vc tah usando. Da pra mandar o codigo com as alteracoes q vc tah falando?

ta. vamos por partes. vc sabe debugar o código?

Velho, lah na minha classe DemoServlet eu mandei um try catch (sugestao do eclipse) no trecho que persiste o objeto e parou de dar erro. Ficou assim:

try {
		myDemoDAO.persisteDemo(myDemo);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

O problema agora eh q os dados nao sao persistidos, ou seja, a tabela do banco tah vazia.

No arquivo de configuracao do hibernate eu apenas mapeei a classe que vai ser persistida assim:

<?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>
		<!-- Conexao Local -->
		<property name="connection.url">jdbc:mysql://localhost/csbuffet</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<property name="query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
		<property name="connection.pool_size">1</property>
		<property name="show_sql">true</property>
		<property name="use_outer_join">true</property>

		<!-- Pool configuration by c3p0 --> 
		<property name="hibernate.c3p0.acquire_increment">1</property> 
		<property name="hibernate.c3p0.idle_test_period">30</property>
		<property name="hibernate.c3p0.max_size">3</property> 
		<property name="hibernate.c3p0.max_statements">0</property> 
		<property name="hibernate.c3p0.min_size">1</property> 
		<property name="hibernate.c3p0.timeout">1800</property>

		<property name="hibernate.cache.use_second_level_cache">false</property>
		<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
		<property name="hibernate.current_session_context_class">thread</property>
		
				
				
		<!-- Mappings Class -->
		<mapping class="fpu.buffet.to.Demo"/>

	</session-factory>
</hibernate-configuration>

O banco possui uma tabela chamada demo com tres atributos, entrada1, entrada2 e entrada3, todos eles varchar. Nao tem chave primaria, por isso achei nao ser necessario criar um arquivo XML exclusivo para essa tabela.

Consegue enxergar algum problema no que falei acima?
P.S.: Nao sei debugar codigo. Na hora que eu do um deploy com o Ant ele gera um log. Isso eh o mais proximo de debugar que eu sei fazer. :frowning: