Problema ao obter uma lista com um genericDAO no hibernate / @OneToMany / @ManyToOne

Consegui dar uma melhorada no codigo:

meu GenericDAO:

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;

public abstract class GenericDAO<T> implements Serializable {

	private static final long serialVersionUID = -4267978367898190996L;

	private static SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	private Class<T> entityClass; 
	
	public GenericDAO(Class<T> entityClass) { 
        this.entityClass = entityClass; 
    }

	public Session getSession() {
		Session session = threadLocal.get();
		if (session == null) {
			session = sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}

	public void beginTransaction() {
		getSession().beginTransaction();
	}

	public void commit() {
		getSession().getTransaction().commit();
	}

	public void rollBack() {
		getSession().getTransaction().rollback();
	}

	public void closeSession() {
		getSession().close();
	}
	
	
	public void save(T entity) {
		getSession().saveOrUpdate(entity);
	}
	
	public void delete(T entity) {
		getSession().delete(entity);
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll() { 
		Criteria criteria = getSession().createCriteria(entityClass);
		criteria.setMaxResults(500);

		return criteria.list();
    } 
	
	@SuppressWarnings("unchecked")
	public T findById(int entityID) { 
        return (T) getSession().get(entityClass, entityID); 
    } 
	
	@SuppressWarnings("unchecked")
	public List<T> findByExample(T filtro, MatchMode matchMode, boolean ignoreCase){  
        Example example = Example.create(filtro);  
  
        if(matchMode != null){  
            example = example.enableLike(matchMode);  
        }  
  
        if(ignoreCase){  
            example = example.ignoreCase();  
        }  
  
        return getSession().createCriteria(entityClass).add(example).list();  
    }  

}

meu hibernate util:

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

public class HibernateUtil {  
  
    private static final SessionFactory sessionFactory;  
  
    static {  
        try {  
            // Create the SessionFactory from hibernate.cfg.xml  
            sessionFactory = new Configuration().configure().buildSessionFactory();  
        } catch (Throwable ex) {  
            // Make sure you log the exception, as it might be swallowed  
            System.err.println("Initial SessionFactory creation failed." + ex);  
            throw new ExceptionInInitializerError(ex);  
        }  
    }  
  
    public static SessionFactory getSessionFactory() {  
        return sessionFactory;  
    }  
  
}  

Minha clase DepartamentoDAO herdando minha classe gerenerica:

public class DepartamentoDAO extends GenericDAO {


	public DepartamentoDAO(Class entityClass) {
		super(entityClass);
		// TODO Auto-generated constructor stub
	}

	public int save(Departamento depart) {
		Session session = null;
		Integer idDepartamento = 0;
		SessionFactory sessionFactory  = HibernateUtil.getSessionFactory();
		
		try {
			session = sessionFactory.openSession();
			Transaction transaction = session.beginTransaction();
			session.save(depart);
			transaction.commit();
		}
		catch(HibernateException e){
			e.printStackTrace();
		}finally {
			if(session != null) {
				session.close();
			}
		}
		return idDepartamento;	
	}
	
	public List<Departamento> getDepartamentos(){
		List<Departamento> listaDepart = null;
		Session session = null;
		SessionFactory sessionFactory  = HibernateUtil.getSessionFactory();
		try {
			session = sessionFactory.openSession();
			CriteriaBuilder builder = session.getCriteriaBuilder();
			CriteriaQuery<Departamento> criteriaQuery = builder.createQuery(Departamento.class);
			criteriaQuery.from(Departamento.class);
			listaDepart = session.createQuery(criteriaQuery).getResultList();
		}
		catch(HibernateException e){
			e.printStackTrace();
		}finally {
			if(session != null) {
				session.close();
			}
		}
		return listaDepart;
		
	}

}

meu main:

public static void main(String[] args) {
	Departamento depart = new Departamento();
	
	GenericDAO abs = new DepartamentoDAO(Departamento.class);
	
	abs.beginTransaction();
	abs.save(depart);
	abs.commit();
	
	List<Departamento> departx = abs.findAll();
	
	System.out.println(departx);
}

meu metodo de salvar funciona normalmente, mas o meu metodo de pegar a lista não.

Stack trace:

Hibernate: select this_.codDepart as codDepar1_0_0_, this_.nome as nome2_0_0_ from departamento this_ limit ?
Hibernate: select funcionari0_.departamento_codDepart as departa13_1_0_, funcionari0_.codFuncionario as codFunci2_1_0_, funcionari0_.codFuncionario as codFunci2_1_1_, funcionari0_.cpf as cpf3_1_1_, funcionari0_.dataEntrada as dataEntr4_1_1_, funcionari0_.dataNascimento as dataNasc5_1_1_, funcionari0_.dataSaida as dataSaid6_1_1_, funcionari0_.departamento_codDepart as departa13_1_1_, funcionari0_.matricula as matricul7_1_1_, funcionari0_.nome as nome8_1_1_, funcionari0_.rg as rg9_1_1_, funcionari0_.salario as salario10_1_1_, funcionari0_.senha as senha11_1_1_, funcionari0_.usuario as usuario12_1_1_ from funconarios funcionari0_ where funcionari0_.departamento_codDepart=?
Hibernate: select funcionari0_.departamento_codDepart as departa13_1_0_, funcionari0_.codFuncionario as codFunci2_1_0_, funcionari0_.codFuncionario as codFunci2_1_1_, funcionari0_.cpf as cpf3_1_1_, funcionari0_.dataEntrada as dataEntr4_1_1_, funcionari0_.dataNascimento as dataNasc5_1_1_, funcionari0_.dataSaida as dataSaid6_1_1_, funcionari0_.departamento_codDepart as departa13_1_1_, funcionari0_.matricula as matricul7_1_1_, funcionari0_.nome as nome8_1_1_, funcionari0_.rg as rg9_1_1_, funcionari0_.salario as salario10_1_1_, funcionari0_.senha as senha11_1_1_, funcionari0_.usuario as usuario12_1_1_ from funconarios funcionari0_ where funcionari0_.departamento_codDepart=?
Exception in thread "main" org.hibernate.InstantiationException: Cannot instantiate abstract class or interface:  : model.Funcionario
	at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:79)
	at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:105)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:673)
	at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:4954)
	at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1721)
	at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1705)
	at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.hydrateEntityState(EntityReferenceInitializerImpl.java:219)
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:103)
	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122)
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
	at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:706)
	at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:74)
	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2285)
	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:585)
	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:263)
	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:581)
	at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:148)
	at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
	at java.lang.String.valueOf(String.java:2994)
	at java.lang.StringBuilder.append(StringBuilder.java:131)
	at model.Departamento.toString(Departamento.java:53)
	at java.lang.String.valueOf(String.java:2994)
	at java.lang.StringBuilder.append(StringBuilder.java:131)
	at java.util.AbstractCollection.toString(AbstractCollection.java:462)
	at java.lang.String.valueOf(String.java:2994)
	at java.io.PrintStream.println(PrintStream.java:821)
	at view.eeee.main(eeee.java:23)

Se alguém puder me ajudar:

Talvez esteja no relacionamento o problema:

Meus dois modelos:

Funcionario :

@Entity(name = "Funcionario")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo", length = 1, discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("F")
@Table(name = "funconarios")
public abstract class Funcionario implements Autenticar {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "codFuncionario")
	private String codFuncionario;
	@ManyToOne  
	@JoinColumn(name="departamento_codDepart", referencedColumnName="codDepart",nullable=false)  
	private Departamento departamento;
	//private Endereco endereco;
	@Column(name = "matricula")
	private String matricula;
	@Column(name = "nome")
	private String nome;
	@Column(name = "cpf")
	private String cpf;
	@Column(name = "rg")
	private String rg;
	@Column(name = "usuario")
	private String usuario;
	@Column(name = "senha")
	private String senha;
	@Column(name = "dataEntrada")
	private Date dataEntrada; 
	@Column(name = "dataSaida")
	private Date dataSaida;
	@Column(name = "dataNascimento")
	private Date dataNascimento;
	@Column(name = "salario")
	private Double salario;
	
//construtores	
    public Funcionario() {
    }

//
// gets and setters 
    
	public String getCodFuncionario() {
		return codFuncionario;
	}
	public String getMatricula() {
		return matricula;
	}
	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	public void setCodFuncionario(String codFuncionario) {
		this.codFuncionario = codFuncionario;
	}
	public Departamento getDepartamento() {
		return departamento;
	} 

	public void setSalario(Double salario) {
		this.salario = salario;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}
/*
	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}*/

	public Double getSalario() {
		return salario;
	}


	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	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 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 Date getDataEntrada() {
		return dataEntrada;
	}

	public void setDataEntrada(Date dataEntrada) {
		this.dataEntrada = dataEntrada;
	}

	public Date getDataSaida() {
		return dataSaida;
	}

	public void setDataSaida(Date dataSaida) {
		this.dataSaida = dataSaida;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
//  metodos 
// to string

	@Override
	public String toString() {
		return "Funcionario [codFuncionario=" + codFuncionario + ", departamento=" + departamento + ", matricula=" + matricula + ", nome=" + nome + ", cpf=" + cpf + ", rg=" + rg
				+ ", usuario=" + usuario + ", senha=" + senha + ", dataEntrada=" + dataEntrada + ", dataSaida="
				+ dataSaida + ", dataNascimento=" + dataNascimento + ", salario=" + salario + "]";
	}


//

e meu modelo
Departamento:

package model;


import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import util.Manager;

@Entity ( name = "departamento")
@Table( name="departamento" ) 
public class Departamento {
	@Id  
	@GeneratedValue  
	@Column(name="codDepart") 
	private Integer codDepartamento;
	@Column(name="nome")  
	private String nomeDepartamento;
	
	@OneToMany(mappedBy="departamento", cascade= CascadeType.ALL)  
	private Set<Funcionario> funcionarios;  
	
    public Departamento() {
    }

	public Integer getCodDepartamento() {
		return codDepartamento;
	}

	public void setCodDepartamento(Integer codDepartamento) {
		this.codDepartamento = codDepartamento;
	}

	public String getNomeDepartamento() {
		return nomeDepartamento;
	}

	public void setNomeDepartamento(String nomeDepartamento) {
		this.nomeDepartamento = nomeDepartamento;
	}

	@Override
	public String toString() {
		return "Departamento [codDepartamento=" + codDepartamento + ", nomeDepartamento=" + nomeDepartamento
				+ ", funcionarios=" + funcionarios + "]";
	}


	
}

minha classe funcionario não tem nenhum registro / minha classe departamento sim.

A classe Funcionario realmente deve ser abstrata? Ela está abstraindo o que?

1 curtida

futuramente vou precisar

tipo eu consegui resolver com isso:

@ManyToOne(cascade = CascadeType.ALL)

na classe do funcionario /

mas me surgiu outra dúvida vc pode me dizer se isso é possível fazer com o hibernate?

tenho classe funcionario

classe vendedor e a classe gerente

a classe vendedor quero que utilize a mesma tabela no banco de dados que a funcionario ( seria uma single table )

mas a classe gerente queria que fosse uma outra table ( joined )

tem como eu aplicar isso no hibernate, dois tipos de heranças ?

Fiz uma pesquisa rápida aqui e parece que não é possível misturar estratégias de herança não. Pq vc não cria logo a tabela de Vendedor? Acho que vai simplificar.

1 curtida

pelo jeito vou ter que fazer isso
você sabe me dizer para que serve o @ Embedded e @Embeddable? procurei e não entendi muito bem quando utilizar esses dois .

Serve para separar classes distintamente com atributos dos quais apontam para uma única tabela no banco, o uso dessas anotações são mais para fins de organização no código.

Exemplo:

@Embeddable
public class Endereco {
    private String logradouro;
    private String numero;
    private String cep;
    private String cidade;
    private String estado;
}

public class Empresa {
    private Long id;
    private String nome;
    @Embedded
    private Endereco endereco;
}

Isso seria o equivalente a isso:

public class Empresa {
    private Long id;
    private String nome;
    private String logradouro;
    private String numero;
    private String cep;
    private String cidade;
    private String estado;
}
2 curtidas

eu posso aplicar isso + herança ou só um o outro?[quote=“Jonathan_Medeiros, post:7, topic:390472, full:true”]
Serve para separar classes distintamente com atributos dos quais apontam para uma única tabela no banco, o uso dessas anotações são mais para fins de organização no código.

Exemplo:

@Embeddable
public class Endereco {
    private String logradouro;
    private String numero;
    private String cep;
    private String cidade;
    private String estado;
}

public class Empresa {
    private Long id;
    private String nome;
    @Embedded
    private Endereco endereco;
}

Isso seria o equivalente a isso:

public class Empresa {
    private Long id;
    private String nome;
    private String logradouro;
    private String numero;
    private String cep;
    private String cidade;
    private String estado;
}

[/quote]

eu posso aplicar isso a uma herança ou só da pra usar embeddable ou herança e não os dois juntos.

São coisas totalmente distintas, herança não tem relação nenhuma com o uso destas anotações, como eu disse, o uso de @Embeddable e @Embedded se dá por questões de organização de código.

1 curtida

entendi é possível,
vlw obrigado mano !!
Você aconselha o spring + hiber para aplicações desktop?

Não aconselho nenhum tipo de tecnologia, para cada tipo de problema deve ser analisado qual a melhor solução, tecnologia é só um meio para atingir um fim!

1 curtida