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