olá pessoal
estou seguindo a apostila do FJ-28, só que utilziando postgres em vez de mySql e ao testar está com um erro estranho: ao executar o adiciona o registro solicitado não é incluído no banco mas o sequence corresponde ao id do registro é atualizado. po exemplo, gero a tabela, faço três inclusões, a tabela está vazia mas o sequence correspondente a tabela no postgres indica que o último registro incluído foi o 3.
após criar o banco via Eclipse o console exibe:
15:20:39,000 INFO SchemaExport:154 - Running hbm2ddl schema export
15:20:39,000 DEBUG SchemaExport:170 - import file not found: /import.sql
15:20:39,000 INFO SchemaExport:179 - exporting generated schema to database
drop table Usuario
15:20:39,250 DEBUG SchemaExport:303 -
drop table Usuario
drop sequence hibernate_sequence
15:20:39,265 DEBUG SchemaExport:303 -
drop sequence hibernate_sequence
create table Usuario (
id int8 not null,
senha varchar(255),
usuario varchar(255),
primary key (id)
)
15:20:39,265 DEBUG SchemaExport:303 -
create table Usuario (
id int8 not null,
senha varchar(255),
usuario varchar(255),
primary key (id)
)
create sequence hibernate_sequence
15:20:39,281 DEBUG SchemaExport:303 -
create sequence hibernate_sequence
15:20:39,281 INFO SchemaExport:196 - schema export complete
aí executo três inclusões (TestaUsuario.java) e a saída na console é:
Hibernate:
select
nextval (‘hibernate_sequence’)
Hibernate:
select
nextval (‘hibernate_sequence’)
Hibernate:
select
nextval (‘hibernate_sequence’)
o que pode estar acontecendo?
a seguir cópia dos fontes:
Dao.java
package br.lna.lojavirtual.dao;
import java.util.List;
import org.hibernate.Session;
/**
- Data Access Object referente a entidade T.
*/
public class Dao {
private final Session session;
private final Class classe;
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 List listaTudo() {
List list = this.session.createCriteria(this.classe).list();
return list;
}
}
DaoFactory.java
package br.lna.lojavirtual.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.vraptor.annotations.Component;
import br.lna.lojavirtual.modelo.*;
import br.lna.lojavirtual.util.HibernateUtil;
@Component(“usuario”)
public class DaoFactory {
private final Session session;
private Transaction transaction;
public DaoFactory() {
session = HibernateUtil.getSession();
}
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();
}
public Dao<Usuario> getUsuarioDao() {
return new Dao<Usuario>(this.session, Usuario.class);
}
}
DaoFactory
package br.lna.lojavirtual.logic;
import org.vraptor.Interceptor;
import org.vraptor.LogicException;
import org.vraptor.LogicFlow;
import org.vraptor.annotations.Out;
import org.vraptor.view.ViewException;
import br.lna.lojavirtual.dao.DaoFactory;
public class DaoInterceptor implements Interceptor {
private final DaoFactory factory = new DaoFactory();
public void intercept(LogicFlow flow) throws LogicException, ViewException {
// executa a logica
flow.execute();
// se sobrou transacao sem comitar, faz rollback
if (factory.hasTransaction()) {
factory.rollback();
}
factory.close();
}
@Out(key=“br.lna.lojavirtual.dao.DaoFactory”)
public DaoFactory getFactory() {
return factory;
}
}
UsuarioLogic.java
package br.lna.lojavirtual.logic;
import org.vraptor.annotations.Component;
import org.vraptor.annotations.InterceptedBy;
import br.lna.lojavirtual.dao.DaoFactory;
import br.lna.lojavirtual.modelo.Usuario;
import br.lna.lojavirtual.logic.DaoInterceptor;
@Component
@InterceptedBy(DaoInterceptor.class)
public class UsuarioLogic {
private final DaoFactory daoFactory;
public UsuarioLogic(DaoFactory daoFactory) {
this.daoFactory = daoFactory;
}
public void adiciona (Usuario usuario) {
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().adiciona(usuario);
this.daoFactory.commit();
}
public void formulario() {
}
}
HibernateUtil
package br.lna.lojavirtual.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
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"?> org.postgresql.Driver usujavatst jdbc:postgresql://localhost:5432/javatst usujavatst org.hibernate.dialect.PostgreSQLDialect <property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping class="br.lna.lojavirtual.modelo.Usuario"/>
</session-factory>
TestaUsuario.java
package br.lna.lojavirtual.main;
import br.lna.lojavirtual.dao.Dao;
import br.lna.lojavirtual.dao.DaoFactory;
import br.lna.lojavirtual.modelo.Usuario;
public class TestaUsuario {
public static void main(String[] args) {
Dao<Usuario> dao = new DaoFactory().getUsuarioDao();
Usuario u1 = new Usuario();
u1.setUsuario("ivana");
u1.setSenha("lna");
dao.adiciona(u1);
Usuario u2 = new Usuario();
u2.setUsuario("lneumann");
u2.setSenha("lna");
dao.adiciona(u2);
Usuario u3 = new Usuario();
u3.setUsuario("angelof");
u3.setSenha("lna");
dao.adiciona(u3);
}
}