Objeto não está sendo persistido no Hibernate, apenas o id incrementado

8 respostas
mauro80

Olá a todos! É um grande prazer poder participar desse fórum de programação.

Bem, vamos lá. Estou seguindo a apostila da Caelum, do curso FJ-28.
Não estou conseguindo inserir um registro no banco usando o hibernate. Aparentemente dá tudo certo, mas apenas o id da tabela usuario é incrementado, nenhum registro é salvo no banco.
Meu banco de dados está criado corretamente. Minhas classes “model” também. Todas estão com as annotation definidas , para a classe (@Entity) e para o id (@Id e @GeneratedValue).

Estou executando o método main da classe TestaUsuario (inserir no banco de dados), mas não ocorre a inclusão, apenas o id é incrementado. Alguém tem alguma idéia do que possa estar acontecendo. Abaixo estou enviando algumas classes e arquivos apenas para rápida visualização do ambiente.
Obrigado.

package br.com.caelum.lojavirtual.modelo;

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

@Entity
public class Usuario {

	@Id
	@GeneratedValue
	private Long id;

	private String login;

	private String senha;

	public Long getId() {
		return id;
	}

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

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

}
package br.com.caelum.lojavirtual.dao;

import java.util.List;

import org.hibernate.Session;

public class Dao<T> {
	private final Session session;
	private final Class classe;
	

	public Dao(Session session, Class classe) {
		this.session = session;
		this.classe = classe;
	}

	public void adiciona(T u) {
		this.session.save(u);
	}

	public void remove(T u) {
		this.session.delete(u);
	}

	public void atualiza(T u) {
		this.session.merge(u);
	}

	public List<T> listaTudo() {
		return this.session.createCriteria(this.classe).list();
	}

	public T procura(Long id) {
		return (T) session.load(this.classe, id);
	}
}
package br.com.caelum.lojavirtual.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.lojavirtual.modelo.Cd;
import br.com.caelum.lojavirtual.modelo.Musica;
import br.com.caelum.lojavirtual.modelo.Usuario;
import br.com.caelum.lojavirtual.util.HibernateUtil;

public class DaoFactory {
	private final Session session;
	private Transaction transaction;

	public DaoFactory() {
		session = HibernateUtil.getSession();
	}

	public Dao<Usuario> getUsuarioDao() {
		return new Dao<Usuario>(this.session, Usuario.class);
	}

	public Dao<Cd> getCdDao() {
		return new Dao<Cd>(this.session, Cd.class);
	}

	public Dao<Musica> getMusicaDao() {
		return new Dao<Musica>(this.session, Musica.class);
	}	

	public void beginTransaction() {
		this.transaction = this.session.beginTransaction();
	}

	public void commit() {
		this.transaction.commit();
		this.transaction = null;
	}

	public boolean hasTransaction() {
		return this.transaction != null;
	}

	public void rollback() {
		this.transaction.rollback();
		this.transaction = null;
	}

	public void close() {
		this.session.close();
	}

}
package br.com.caelum.lojavirtual.util;

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

public class HibernateUtil {

	private static SessionFactory factory;

	static {
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		factory = conf.buildSessionFactory();
	}

	public static Session getSession() {
		return  factory.openSession();
	}
}

hibernate.cfg.xml

<?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>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/lojavirtual</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<mapping class="br.com.caelum.lojavirtual.modelo.Usuario" />
		<mapping class="br.com.caelum.lojavirtual.modelo.Cd" />
		<mapping class="br.com.caelum.lojavirtual.modelo.Musica" />
	</session-factory>
</hibernate-configuration>

Considerando que dois usuários foram inseridos no banco de dados manualmente.
Posso ficar executando esse método um monte de vezes, mas nunca é adicionado o usuário, apenas o id na tabela é incrementado, já que ele é auto-increment.

package br.com.caelum.lojavirtual.main;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.lojavirtual.dao.DaoFactory;
import br.com.caelum.lojavirtual.dao.Dao;
import br.com.caelum.lojavirtual.modelo.Usuario;
import br.com.caelum.lojavirtual.util.HibernateUtil;

public class TestaUsuario {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSession();

		// cria um usuario
		Usuario u = new Usuario();
		u.setLogin("ciclano");
		u.setSenha("ciclano");

		Dao<Usuario> dao = new DaoFactory().getUsuarioDao();

		Transaction t = session.beginTransaction();
		dao.adiciona(u);
		t.commit();

		// lista usuarios
		List<Usuario> lista = dao.listaTudo();
		for (Usuario usuario : lista) {
			System.out.println(usuario.getLogin());			
		}
		session.close();
	}
}

Saída do programa:

13:48:15,273  INFO Version:15 - Hibernate Annotations 3.3.1.GA
13:48:15,295  INFO Environment:514 - Hibernate 3.2.6
13:48:15,300  INFO Environment:547 - hibernate.properties not found
13:48:15,305  INFO Environment:681 - Bytecode provider name : cglib
13:48:15,313  INFO Environment:598 - using JDK 1.4 java.sql.Timestamp handling
13:48:15,414  INFO Configuration:1432 - configuring from resource: /hibernate.cfg.xml
13:48:15,414  INFO Configuration:1409 - Configuration resource: /hibernate.cfg.xml
13:48:15,687  INFO Configuration:1547 - Configured SessionFactory: null
13:48:15,768  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Usuario
13:48:15,824  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Usuario on table Usuario
13:48:15,880  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Cd
13:48:15,880  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Cd on table Cd
13:48:15,882  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Musica
13:48:15,882  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Musica on table Musica
13:48:15,981  INFO Version:17 - Hibernate Validator 3.0.0.GA
13:48:16,018  INFO DriverManagerConnectionProvider:41 - Using Hibernate built-in connection pool (not for production use!)
13:48:16,018  INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 20
13:48:16,018  INFO DriverManagerConnectionProvider:45 - autocommit mode: false
13:48:16,028  INFO DriverManagerConnectionProvider:80 - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/lojavirtual
13:48:16,028  INFO DriverManagerConnectionProvider:86 - connection properties: {user=root, password=****}
13:48:16,387  INFO SettingsFactory:89 - RDBMS: MySQL, version: 5.0.51b-community-nt
13:48:16,387  INFO SettingsFactory:90 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
13:48:16,405  INFO Dialect:152 - Using dialect: org.hibernate.dialect.MySQLDialect
13:48:16,410  INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
13:48:16,412  INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
13:48:16,413  INFO SettingsFactory:143 - Automatic flush during beforeCompletion(): disabled
13:48:16,413  INFO SettingsFactory:147 - Automatic session close at end of transaction: disabled
13:48:16,413  INFO SettingsFactory:154 - JDBC batch size: 15
13:48:16,413  INFO SettingsFactory:157 - JDBC batch updates for versioned data: disabled
13:48:16,414  INFO SettingsFactory:162 - Scrollable result sets: enabled
13:48:16,415  INFO SettingsFactory:170 - JDBC3 getGeneratedKeys(): enabled
13:48:16,415  INFO SettingsFactory:178 - Connection release mode: auto
13:48:16,416  INFO SettingsFactory:202 - Maximum outer join fetch depth: 2
13:48:16,418  INFO SettingsFactory:205 - Default batch fetch size: 1
13:48:16,418  INFO SettingsFactory:209 - Generate SQL with comments: disabled
13:48:16,419  INFO SettingsFactory:213 - Order SQL updates by primary key: disabled
13:48:16,419  INFO SettingsFactory:217 - Order SQL inserts for batching: disabled
13:48:16,419  INFO SettingsFactory:386 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
13:48:16,422  INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
13:48:16,422  INFO SettingsFactory:225 - Query language substitutions: {}
13:48:16,423  INFO SettingsFactory:230 - JPA-QL strict compliance: disabled
13:48:16,423  INFO SettingsFactory:235 - Second-level cache: enabled
13:48:16,423  INFO SettingsFactory:239 - Query cache: disabled
13:48:16,423  INFO SettingsFactory:373 - Cache provider: org.hibernate.cache.NoCacheProvider
13:48:16,424  INFO SettingsFactory:254 - Optimize cache for minimal puts: disabled
13:48:16,424  INFO SettingsFactory:263 - Structured second-level cache entries: disabled
13:48:16,429  INFO SettingsFactory:283 - Echoing all SQL to stdout
13:48:16,430  INFO SettingsFactory:290 - Statistics: disabled
13:48:16,430  INFO SettingsFactory:294 - Deleted entity synthetic identifier rollback: disabled
13:48:16,431  INFO SettingsFactory:309 - Default entity-mode: pojo
13:48:16,431  INFO SettingsFactory:313 - Named query checking : enabled
13:48:16,471  INFO SessionFactoryImpl:161 - building session factory
13:48:16,788  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: 
    insert 
    into
        Usuario
        (login, senha) 
    values
        (?, ?)
Hibernate: 
    select
        this_.id as id0_0_,
        this_.login as login0_0_,
        this_.senha as senha0_0_ 
    from
        Usuario this_
beltrano
aaa
ciclano

8 Respostas

lcegatti

Tente anotar os atributos da sua classe Usuario:

@Column
private String login;  

@Column
private String senha;

[]'s

mauro80

Olá colega, fiz isso também e não inseriu ainda.
:(.

Nossa, deve ser algo que esqueci. Mas já verifiquei tudo que é linha…rs.

O estranho é que se eu ficar executando o main da classe TestaUsuario, o id da tabela usuario no banco fica incrementando e se eu fizer um insert manual no banco ele pega esse id incrementado.

lcegatti

Qual o nome das colunas login e senha na sua tabela de usuario ?

mauro80

Então, eu tenho a tabela usuario no bd, com os campos:

  • id -> bigint auto_increment
  • login -> varchar…
  • senha-> varchar…
V

Então cara… o que você deve fazer:

Ao utilizar as anotações @Column, vc deve especificar quais colunas aqueles determinados campos estão mapeando na sua tabela do banco de dados.

Exemplo:
no meu banco de dados, eu tenho uma coluna, chamada “nome”, not null e que é do tipo varchar…

na minha classe eu terei que mapear a coluna da seguinte maneira:

@Column(name = "nome", nullable = false)
public String getNome() {
    return nome;
}

Ou então vc pode vincular a anotação a um atributo, que funciona da mesma maneira:

@Column(name = "nome", nullable = false)
private String nome;
mauro80

Olá, então amigo, fiz assim também e não adiciona no banco de dados.

mauro80

Tomei o cuidado para checar com a apostila, está tudo igual. Apenas mudei a versão do Tomcat para a 6.
O estranho é que nenhum erro ocorre, e como resultado na saída mostra o registro que foi incluso no banco, mas nenhum registro foi incluso no banco!!!?? rss.

14:47:35,706  INFO Version:15 - Hibernate Annotations 3.3.1.GA
14:47:35,726  INFO Environment:514 - Hibernate 3.2.6
14:47:35,731  INFO Environment:547 - hibernate.properties not found
14:47:35,735  INFO Environment:681 - Bytecode provider name : cglib
14:47:35,743  INFO Environment:598 - using JDK 1.4 java.sql.Timestamp handling
14:47:35,839  INFO Configuration:1432 - configuring from resource: /hibernate.cfg.xml
14:47:35,840  INFO Configuration:1409 - Configuration resource: /hibernate.cfg.xml
14:47:36,110  INFO Configuration:1547 - Configured SessionFactory: null
14:47:36,188  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Usuario
14:47:36,239  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Usuario on table Usuario
14:47:36,301  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Cd
14:47:36,302  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Cd on table Cd
14:47:36,304  INFO AnnotationBinder:418 - Binding entity from annotated class: br.com.caelum.lojavirtual.modelo.Musica
14:47:36,305  INFO EntityBinder:424 - Bind entity br.com.caelum.lojavirtual.modelo.Musica on table Musica
14:47:36,409  INFO Version:17 - Hibernate Validator 3.0.0.GA
14:47:36,441  INFO DriverManagerConnectionProvider:41 - Using Hibernate built-in connection pool (not for production use!)
14:47:36,442  INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 20
14:47:36,442  INFO DriverManagerConnectionProvider:45 - autocommit mode: false
14:47:36,452  INFO DriverManagerConnectionProvider:80 - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/lojavirtual
14:47:36,452  INFO DriverManagerConnectionProvider:86 - connection properties: {user=root, password=****}
14:47:36,790  INFO SettingsFactory:89 - RDBMS: MySQL, version: 5.0.51b-community-nt
14:47:36,790  INFO SettingsFactory:90 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
14:47:36,808  INFO Dialect:152 - Using dialect: org.hibernate.dialect.MySQLDialect
14:47:36,813  INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
14:47:36,815  INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
14:47:36,816  INFO SettingsFactory:143 - Automatic flush during beforeCompletion(): disabled
14:47:36,816  INFO SettingsFactory:147 - Automatic session close at end of transaction: disabled
14:47:36,816  INFO SettingsFactory:154 - JDBC batch size: 15
14:47:36,816  INFO SettingsFactory:157 - JDBC batch updates for versioned data: disabled
14:47:36,819  INFO SettingsFactory:162 - Scrollable result sets: enabled
14:47:36,819  INFO SettingsFactory:170 - JDBC3 getGeneratedKeys(): enabled
14:47:36,820  INFO SettingsFactory:178 - Connection release mode: auto
14:47:36,821  INFO SettingsFactory:202 - Maximum outer join fetch depth: 2
14:47:36,821  INFO SettingsFactory:205 - Default batch fetch size: 1
14:47:36,821  INFO SettingsFactory:209 - Generate SQL with comments: disabled
14:47:36,821  INFO SettingsFactory:213 - Order SQL updates by primary key: disabled
14:47:36,822  INFO SettingsFactory:217 - Order SQL inserts for batching: disabled
14:47:36,822  INFO SettingsFactory:386 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
14:47:36,825  INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
14:47:36,825  INFO SettingsFactory:225 - Query language substitutions: {}
14:47:36,825  INFO SettingsFactory:230 - JPA-QL strict compliance: disabled
14:47:36,826  INFO SettingsFactory:235 - Second-level cache: enabled
14:47:36,826  INFO SettingsFactory:239 - Query cache: disabled
14:47:36,826  INFO SettingsFactory:373 - Cache provider: org.hibernate.cache.NoCacheProvider
14:47:36,826  INFO SettingsFactory:254 - Optimize cache for minimal puts: disabled
14:47:36,827  INFO SettingsFactory:263 - Structured second-level cache entries: disabled
14:47:36,832  INFO SettingsFactory:283 - Echoing all SQL to stdout
14:47:36,832  INFO SettingsFactory:290 - Statistics: disabled
14:47:36,832  INFO SettingsFactory:294 - Deleted entity synthetic identifier rollback: disabled
14:47:36,833  INFO SettingsFactory:309 - Default entity-mode: pojo
14:47:36,834  INFO SettingsFactory:313 - Named query checking : enabled
14:47:36,873  INFO SessionFactoryImpl:161 - building session factory
14:47:37,183  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: 
    insert 
    into
        Usuario
        (login, senha) 
    values
        (?, ?)
Hibernate: 
    select
        this_.id as id0_0_,
        this_.login as login0_0_,
        this_.senha as senha0_0_ 
    from
        Usuario this_
beltrano
aaa
ciclano

-> os dois primeiros registros foram inseridos manualmente e o ciclano era pra ser inserido com a execução do TestaUsuario, mas qdo checo manualmente pela linha de comando ele não está , fica apenas incrementando o id da minha tabela...
mauro80

Olá pessoal. Uma olhada com mais calma percebi que estavam sendo criadas duas sessões. A classe TestaUsuario correta ficou assim:

package br.com.caelum.lojavirtual.main;

import java.util.List;

import br.com.caelum.lojavirtual.dao.Dao;
import br.com.caelum.lojavirtual.dao.DaoFactory;
import br.com.caelum.lojavirtual.modelo.Usuario;

public class TestaUsuario {
	public static void main(String[] args) {
		// cria um usuario
		Usuario u = new Usuario();
		u.setLogin("ciclano");
		u.setSenha("ciclano");
		DaoFactory daoFactory = new DaoFactory();
		
		Dao<Usuario> dao = daoFactory.getUsuarioDao();
		
		daoFactory.beginTransaction();
		dao.adiciona(u);
		daoFactory.commit();

		// lista usuarios
		List<Usuario> lista = dao.listaTudo();
		for (Usuario usuario : lista) {
			System.out.println(usuario.getLogin());
		}
		daoFactory.close();
	}
}
Criado 5 de setembro de 2008
Ultima resposta 5 de set. de 2008
Respostas 8
Participantes 3