Hibernate + eclipse + java + Sobrescrevendo o banco de dados

4 respostas
nadasei

Pessoal. Tenho um programa e estou tentando mudar o acesso para banco de dados. Comecei com o Hibernate + java + eclipse + PostGreSql.
O problema que estou enfrentando é o seguinte.
Eu gravo as informações no banco, tudo ok, tudo certinho…
Então quando eu vou ler as informações, o meu código apaga tudo o que estava no banco.
Tentei várias coisas, mas não consigo ver o erro.
Podem me ajudar?

-> Classe que eu acesso o banco, gravo e leio o que está lá.

package com.hibernate.chapter1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class TestEmployee {

	/**
	 * @param args
	 */
	
	
	public static void main(String[] args)  {
		

		//enviaDados();
		recebeDados();
	}
	
	


	public static void enviaDados()
	{//persiste no banco
		Session session = null ;
		Transaction tx = null;
		try{
			// aqui nós lemos as configurações do arquivo hibernate.cfg.xml
			// e deixamos o Hibernate pronto para trabalhar
			SessionFactory factory = new Configuration().addAnnotatedClass(Employee.class).configure("hibernate.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez
			session = factory.openSession();
			// inicia uma transação
			tx = session.beginTransaction();
			//povoando arraylist

			ArrayList <Integer> vetor = new ArrayList();

			for(int i=0;i<10;++i)
			{
				vetor.add(i);
			}

			for ( int i=0; i < vetor.size(); i++ ) {
				Employee empData = new Employee();
				//	alex.setEmpId(50);

				empData.setEmpDada(vetor.get(i));
				session.save(empData);
				//alex.setEmpId(i);
				//	System.out.println("gravei uma id:" + alex.getEmpId());
				//session.save(alex);
				session.flush();

			}
			tx.commit();
			// fecha a transação

		}catch(Exception e){
			// houve algum problema? vamos retornar o banco de dados
			// ao seu estado anterior
			if(tx != null){
				tx.rollback();
				System.out.println(e.getMessage());
			}

		}finally{
			//session.close();
		}

	}//


	public static  void recebeDados()
	{//obtem dado persistido no banco
	//	SessionFactory  factory = new Configuration().addClass(Employee.class).buildSessionFactory(); 
    	//Session session = factory.openSession();

	 
	    
	    try {
	    	// aqui nós lemos as configurações do arquivo hibernate.cfg.xml
	    	// e deixamos o Hibernate pronto para trabalhar
			SessionFactory factory = new Configuration().addAnnotatedClass(Employee.class).configure("hibernate.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez
	    	// abre uma nova sessão
	    	Session session = factory.openSession();

	    	 List <Employee> lista_pessoa = new ArrayList();
	    	 lista_pessoa = session.createCriteria(Employee.class).list();
	    	 int tamanho_lista = lista_pessoa.size();
	    	 String dados = "";
	    	 
	    	 for(int i=0; i<tamanho_lista; ++i)
	    	 {
	    		 Employee a = lista_pessoa.get(i);
	    		 System.out.println(a.getEmpDada());
	    		 session.flush();
	    	 }
	    	 session.clear();
	    	 
	    	//  ArrayList <Integer> recebevetor = new ArrayList<Integer>();

/*	    	Query query = session.createQuery("from Employee");
	    	List listaUsuarios = query.list();

	    	Iterator it = listaUsuarios.iterator();

	    	while(!it.hasNext()){

	    		Employee a = (Employee)it.next();


	    		//recebevetor.add(iterator,empData.getEmpDada());
	    		System.out.println("Id:" + a.getEmpDada());

	    	}
*/
	    }
	    catch(Exception erro) {
	      // houve algum problema? vamos retornar o banco de dados
	      // ao seu estado anterior
	      System.out.println(erro.getMessage());
	    }

	  }





}//fecha classe

-> gerar a tabela e tals…

package com.hibernate.chapter1;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;




//@Table(name = "USUARIO")  
//@TableGenerator(name = "USUARIO_GEN", table = "GENERATOR_ID", pkColumnName = "ID", valueColumnName = "VALOR", pkColumnValue = "USUARIO", allocationSize = 1)  
@Entity  
public class Employee {
	@Id  
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int empId;
	private String empName;
	private int empDada;
	

	public int getEmpDada() {
		return empDada;
	}
	public void setEmpDada(int empDada) {
		this.empDada = empDada;
	}
	public int getEmpId() {
		return empId;
	}
	public void setEmpId(int empId) {
		this.empId = empId;
	}
	public String getEmpName() {
		return empName;
	}
	public void setEmpName(String empName) {
		this.empName = empName;
	}
	
	
}

e aqui o XML

<?xml version='1.0'?>

<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/Hibernate</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">123456</property>
		<property name="hibernate.default_schema">Teste</property>
 		<property name="current_session_context_class">thread</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">2</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <mapping resource="hibernate.cfg.xml"/>

    </session-factory>

</hibernate-configuration>

Alguém clareia minha vista ai…
Obrigado!

4 Respostas

Hebert_Coelho

troca de
create
para
update

nadasei

Deu certo !!!

O que passa agora é que ele está acrescentando no final do banco…cada vez que eu rodo…

Eu deveria ter um xml pra cada tipo de operação(inclusão e consulta)?

nadasei

Fiz o seguinte.

Na função de ler do banco, eu usei um xml, com

<!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">validate</property>

validate para que ele não sobrescreva no banco…

try {
	    	// aqui nós lemos as configurações do arquivo hibernate.cfg.xml
	    	// e deixamos o Hibernate pronto para trabalhar
			SessionFactory factory = new Configuration().addAnnotatedClass(Employee.class).configure("leiturabanco.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez
	    	// abre uma nova sessão
	    	Session session = factory.openSession();

Essa é a maneira correta de fazer isso??? Funcionar funciona…mas é certo?

Hebert_Coelho

Só entenda que com o validate cada alteração feita em suas classes de Entity não serão refletidas no DB. Se você adicionar um atributo em sua classe você terá que criar essa coluna no DB.

Criado 10 de junho de 2012
Ultima resposta 11 de jun. de 2012
Respostas 4
Participantes 2