Duvida - Herança

6 respostas
R

Pessoal, Tenho um relacionamento de herança.

a classe abstrata Cliente é estendido por fisico e juridico.
Fiz o mapeamento de herança com xml para persistir no hibernate. (uma tabela por Entidade)

A duvida é a seguinte.

Em tempo de execução consulto um Cliente(pode ser fisico ou juridico).

as duvidas estão como comentario no codido:

DAO<Cliente> clienteDAO = new GenericHibernateDAO<Cliente>(Cliente.class);
             cliente = clienteDAO.carregaUm(jTextField1Cod.getText()); 

            //descubro a instancia do objeto cliente utilizando instanceof
            //Suponha-se que seja Fisico, como utilizar os métodos especifico deste objeto?
   
            //Posso fazer isso ?
            ((Fisico)cli).getData_hora_Entrada().getSegundo()) 
            //ou é muita gambiara?

6 Respostas

bsl.lacerda

Acho que basta chamar o método que voccê quer que dependendo da Instância o método agirá de forma diferente, sem você ter que se preocupar com instanceOf ou casting.

Eu acho…

peczenyj

Humm…

void fazAlgo(Juridico juridico) { ... } void fazAlgo(Fisico fisico) { fisico.getData_hora_Entrada().getSegundo();} ... DAO<Cliente> clienteDAO = new GenericHibernateDAO<Cliente>(Cliente.class); cliente = clienteDAO.carregaUm(jTextField1Cod.getText()); fazAlgo(cliente);

R

humm,
eu resolvi o problema com Cast (mas creio que isso não é uma maneira elegante viu) ta me cheirando mal.

mas bem.

bsl.lacerda

Classe Cliente

public abstract class Cliente {
	
	public abstract void getData();

}

Classe Fisico

public class Fisico extends Cliente {

	@Override
	public void getData() {
		System.out.println("Fisico");
		
	}

}

Classe Juridico

public class Juridico extends Cliente {

	@Override
	public void getData() {
		System.out.println("Juridico");
		
	}

}

Classe Teste

public class TestaCliente {
	
	public static void main(String[] args) {
		Cliente cliente1 = new Fisico();
		Cliente cliente2 = new Juridico();
		
		descobreCliente(cliente1);
		descobreCliente(cliente2);
		
	}
	
	public static void descobreCliente(Cliente cliente) {
		cliente.getData();
	}

}

Seria isso?

R

peczenyj entendi o que teu codigo faz.

você utiliza sobrecarga, hummmm
independente da subclasse que eu recuperar e a jvm verifica o tipo do objeto pra mim e executa o metodo adequado.
legal

Serial isso?

R

Eu estava tendo problema com o carregamento preguiçoso do hibernate.

No meu DAO Generico tenho algo assim:

public T carregaUm(Serializable id)   
    {
         Session session = null;
         T element = null;
       
         try
         {
   
             session = HibernateUtil.getSessionFactory().openSession();
             element =(T)session.createCriteria(this.persistentClass)
                     .add(Restrictions.idEq(id))
                     .uniqueResult();
       
             return element;
           
         }catch(HibernateException e)
         {
             throw e;
           
         }finally
         {
            //session.close();
             return element;
         }

Eu fechava a sessão no finally mas quando tentava carregar as informações do objeto que eu mostrei acima uma excessão era gerada.

Então eu coloquei como comentario session.close() e funcionou.
mas a duvida é a seguinte?

Isso tambem não me paresse ser legal.

Devo abrir uma outra sessão quando precisar carregar mais algo do objeto?

Criado 6 de novembro de 2008
Ultima resposta 6 de nov. de 2008
Respostas 6
Participantes 3