Iniciando com Hibernate - problemas

3 respostas
D

Estou iniciando no java mais ja programo em delphi.
Ja li algum material e agora estou tentando acessar dados que tenho numa base que uso com delphi, atraves do hibernate.

Criei uma classe bem simples só pra tentar entender como configurar corretamente o hibernate pra acessar o mysql.

@Table(name="TabClientes")
public class Clientes implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_cliente")
	int id;
	
	@Column(name="nm_razao")
	String razaoSocial;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	public Clientes() {}
	
}

A tabela tem mais campos, mais não usei todos no meu teste. Acredito que não seja um problema...

Arquivo de configuração do hibernate:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
  <persistence-unit name="database"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>entities.Clientes</class> 

    <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/database" />
      <property name="javax.persistence.jdbc.user" value="root" /> 
      <property name="javax.persistence.jdbc.password" value="senha" /> 
    </properties> 
  </persistence-unit> 
</persistence>

Classe pra fazer o teste:

public class ListaClientes {

	public static void main(String[] args) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("database");
		EntityManager em = factory.createEntityManager();
		
		List<Clientes> listClientes = (List<Clientes>) em.createQuery("from Clientes", Clientes.class).getResultList();
		
		for(int i = 0; i < listClientes.size(); i++) {
			System.out.println(listClientes.get(i).getRazaoSocial());
		}
	}

}

Não da erro, mais não retorna o esperado. A tabela tem 450 registros, retorna uma lista de 450 "null"s.

Estou usando o log4j jogando no console pra ver oq acontece.
O hibernate faz a conexão, encontra a tabela, lista TODOS os campos da tabela, etc...
Um pouco pra frente, acredito que seja na hora que executa a Query, mostra um select que é executado:

select
        clientes0_.id_cliente as t1_0_,
        clientes0_.nm_razao as t2_0_
    from
        TabClientes clientes0_

Ai aparece o resultado do System.out.println()

null
null
null
....
...
..
..

.... 450 linhas de null's

Que mer** que estou fazendo???
Imagino que tenha algo a ver com os "aliases" que o hibernate adicionou por conta...

Algum pode me dar uma luz?

Desculpe a mensagem t"ao longa, mais acho que consegui mostrar todos os detalhes do meu problema.

Tks

Dante Martins

3 Respostas

heroijapa

Fala amigo Delphero!

Trabalhei com delphi anos tbm...

Cara acho que é o seguinte, erro leve, as annotations deviam estar nos metodos e não na coluna em si.

elas deveriam estar no metodo get

@Table(name="TabClientes")
public class Clientes implements Serializable {
	
	private static final long serialVersionUID = 1L;

	int id;
	
	String razaoSocial;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_cliente")
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(name="nm_razao")
	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	public Clientes() {}
	
}

isso deve resolver.

D

Obrigado pela ajuda heroijapa!

Achei que a forma que eu tinha feito estava certa, pois segui de foram adaptada uma “receita de bolo”…

Mesmo assi modifiquei meu codigo, passando as annotations para os metodos “get” e…

O resultado foi exatamente o mesmo…

Posso estar enganado, mais a parte que achei estranha é a forma que o hibernate gerou o sql pra consulta colocando aqueles " as t1_0_ " para os campos.
Se na annotation eu informo “id_cliente” e o hibernate gera um alias “t1_0_”, como que é feita a alimentação dos fields de forma correta… na minha “leiguisse” acredito qu seja esse o problema.

D

Não ha nada errado com meu codigo, mudei alguns detalhes pra acessar uma base local no xampp (MySQL), deixei que o hibernate criasse a tabela ai grveei alguns registros.
Rodei o mesmo teste funcionou direitinho…

A diferença nos 2 ambientes seria o local onde esta a base, um esta num provedor de serviço na web e outro esta no meu PC… o da web n rola…

Criado 1 de fevereiro de 2011
Ultima resposta 2 de fev. de 2011
Respostas 3
Participantes 2