Olá galera,
Depois de perder várias horas tentando resolver esse problema, eu recorro a vocês. Espero que possam me ajudar. Estou iniciando os estudos em JSF, JPA e Hibernate, e para isso estou desenvolvendo um sisteminha, mas a cada momento encontro um novo problema. Enfim, faz parte!!!
O problema é q a minha consulta não retorna nenhum dado. Não sei o porquê disso? Segue os códigos:
Meu entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import java.io.Serializable;
@Entity
public class Login implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
private String usuario;
private String senha;
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Este é meu arquivo persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="persistenceUnit"
transaction-type="RESOURCE_LOCAL">
<class>br.com.srpvsp.entity.Login</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/livroeletronico"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="false" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.jdbc.batch_size" value="50" />
<!--
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class"
value="org.hsqldb.jdbcDriver" />
<property name="hibernate.connection.url"
value="jdbc:hsqldb:mem:mem:aname" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create" />
-->
</properties>
</persistence-unit>
</persistence>
A interface do meu Dao genérico:
import java.io.Serializable;
import java.util.List;
public interface IGenericoDao<T, Id extends Serializable> {
public void atualizar(T entity);
public void remover(T entity);
public T inserir(T entity);
public List<T> buscarTodos();
public T buscarPorId(Id id);
}
A implementação do Dao genérico utilizando JPA:
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
public abstract class GenericoDaoImp<T, Id extends Serializable> implements IGenericoDao<T, Id> {
private Class<T> persistentClass;
@PersistenceContext
private EntityManager entityManager;
private EntityManagerFactory emf;
public GenericoDaoImp(Class<T> persistentClass) {
this.setEntityManager();
this.persistentClass = persistentClass;
}
public Class<T> getPersistentClass() {
return persistentClass;
}
public void setEntityManager() {
if (this.entityManager == null)
{
if (emf == null){
emf = Persistence.createEntityManagerFactory("persistenceUnit");
}
this.entityManager = emf.createEntityManager();
}
}
public EntityManager getEntityManager() {
return entityManager;
}
public void atualizar(T entity) {
this.entityManager.persist(entity);
}
public abstract List<T> buscarTodos();
public T buscarPorId(Id id) {
return this.entityManager.find(this.persistentClass, id);
}
public T inserir(T entity) {
this.entityManager.persist(entity);
return entity;
}
public void remover(T entity) {
this.entityManager.remove(entity);
}
}
O meu Dao genérico utilizando o Hibernate:
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Criterion;
public class GenericoHibernateDao<T, Id extends Serializable> extends GenericoDaoImp<T, Id> {
public GenericoHibernateDao(Class<T> clazz){
super(clazz);
}
@Override
@SuppressWarnings("unchecked")
public List<T> buscarTodos() {
return this.getCriteria().list();
}
@SuppressWarnings("unchecked")
public List<T> buscarPorCriterios(List<Criterion> criterions){
Criteria criteria = this.getCriteria();
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria.list();
}
private Criteria getCriteria(){
Session session = (Session) super.getEntityManager().getDelegate();
Criteria criteria = session.createCriteria(super.getPersistentClass());
return criteria;
}
}
E aqui está o código que acessa o Dao:
List<Criterion> criterions = new ArrayList<Criterion>();
GenericoHibernateDao<Login,Long> dao = new GenericoHibernateDao<Login,Long>(Login.class);
List<Login> list = dao.buscarTodos();
O resultado dessa consulta é um objeto List vazio, sem dados. Qual o problema? O que está errado? O projeto executa sem erros, mas nada do resultado da consulta vir.