Olá pessoal, estou com um problema ao tentar usar um DAO genérico, quando tento usar um DAOFactory.
Não obtenho mensagens de erro, mas também não salva nada no banco.
Esta é a entidade Cliente, a qual persisto.:
package br.com.siscolorimetry.dominio;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(name = "nome")
private String nome;
@Column(name = "situacao")
private boolean situacao;
@Column(name = "tipo")
@Enumerated(EnumType.STRING)
private String tipo;
@Column(name = "cpf")
private String cpf;
@Column(name = "rg")
private String rg;
@Column(name = "endereco")
private String endereco;
@Column(name = "bairro")
private String bairro;
@Column(name = "cep")
private String cep;
@Column(name = "cidade")
private String cidade;
@Column(name = "estado")
private String estado;
@Column(name = "tel_res")
private String telRes;
@Column(name = "tel_com")
private String telCom;
@Column(name = "tel_cel")
private String telCel;
@Column(name = "email")
private String email;
@Column(name = "refe1")
private String refe1;
@Column(name = "refe2")
private String refe2;
@Column(name = "refe3")
private String refe3;
@Column(name = "observacao")
private String observacao;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public boolean isSituacao() {
return situacao;
}
public void setSituacao(boolean situacao) {
this.situacao = situacao;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getRg() {
return rg;
}
public void setRg(String rg) {
this.rg = rg;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
public String getTelRes() {
return telRes;
}
public void setTelRes(String telRes) {
this.telRes = telRes;
}
public String getTelCom() {
return telCom;
}
public void setTelCom(String telCom) {
this.telCom = telCom;
}
public String getTelCel() {
return telCel;
}
public void setTelCel(String telCel) {
this.telCel = telCel;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRefe1() {
return refe1;
}
public void setRefe1(String refe1) {
this.refe1 = refe1;
}
public String getRefe2() {
return refe2;
}
public void setRefe2(String refe2) {
this.refe2 = refe2;
}
public String getRefe3() {
return refe3;
}
public void setRefe3(String refe3) {
this.refe3 = refe3;
}
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cliente other = (Cliente) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
Uso este DAO Genérico
package br.com.siscolorimetry.dao.hibernate;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Session;
import br.com.siscolorimetry.dao.GenericDAO;
public class HibernateGenericDAO<T> implements GenericDAO<T> {
private Class<T> persistentClass;
private Session session;
@SuppressWarnings("unchecked")
public HibernateGenericDAO(Session session) {
this.session = session;
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Session getSession() {
return this.session;
}
@SuppressWarnings("unchecked")
@Override
public T pesquisaPorID(Serializable id) {
return (T) this.session.get(this.persistentClass, id);
}
@SuppressWarnings("unchecked")
@Override
public List<T> ListarTodos() {
return this.session.createCriteria(this.persistentClass).list();
}
@SuppressWarnings("unchecked")
@Override
public T salvar(T entidade) {
return (T) this.session.merge(entidade);
}
@Override
public void excluir(T entidade) {
this.session.delete(entidade);
}
}
Para usar as transações, tento, sem sucesso usar esta Classe
package br.com.siscolorimetry.dao.hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.siscolorimetry.dao.ClienteDAO;
import br.com.siscolorimetry.dao.DAOFactory;
import br.com.siscolorimetry.util.HibernateUtil;
public class HibernateDAOFactory extends DAOFactory {
private Session session;
private Transaction tx;
public HibernateDAOFactory() {
this.session = HibernateUtil.getSession();
}
@Override
public void cancelarTransacao() {
this.tx.rollback();
this.tx = null;
}
@Override
public void iniciarTransacao() {
this.tx = this.session.beginTransaction();
}
@Override
public void encerrar() {
if (this.tx != null) {
this.tx.commit();
}
this.session.close();
}
@Override
public ClienteDAO getClienteDAO() {
return new HibernateClienteDAO(this.session);
}
}
A interface DAOFactory
package br.com.siscolorimetry.dao;
import br.com.siscolorimetry.dao.hibernate.HibernateDAOFactory;
public abstract class DAOFactory {
public static DAOFactory getDAOFactory() {
return new HibernateDAOFactory();
}
public abstract void iniciarTransacao();
public abstract void cancelarTransacao();
public abstract void encerrar();
public abstract ClienteDAO getClienteDAO();
}
Esta é a minha service.
package br.com.siscolorimetry.negocio;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import br.com.siscolorimetry.dao.ClienteDAO;
import br.com.siscolorimetry.dao.DAOFactory;
import br.com.siscolorimetry.dominio.Cliente;
import br.com.siscolorimetry.util.HibernateUtil;
public class ClienteService {
public Cliente pesquisarPorId(Long id) {
Session session = HibernateUtil.getSession();
try {
return (Cliente) session.get(Cliente.class, id);
} finally {
session.close();
}
}
@SuppressWarnings("unchecked")
public List<Cliente> listarTodos() {
Session session = HibernateUtil.getSession();
try {
return session.createCriteria(Cliente.class)
.addOrder(Order.asc("nome")).list();
} finally {
session.close();
}
}
public Cliente salvar(Cliente cliente) {
DAOFactory daoFactory = DAOFactory.getDAOFactory();
ClienteDAO clienteDAO = daoFactory.getClienteDAO();
cliente = clienteDAO.salvar(cliente);
daoFactory.encerrar();
return cliente;
//FUNCIONA SE USAR ISSO AQUI EMBAIXO, MAS NÃO FUNCIONA SE USAR O DAOFACTORY NÃO TENHO SUCESSO
// Session session = HibernateUtil.getSession();
// Transaction tx = session.beginTransaction();
// session.saveOrUpdate(cliente);
// tx.commit();
// session.close();
}
public void excluir(Cliente cliente) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.delete(cliente);
tx.commit();
session.close();
}
}