Hibernate... Mapeamento de herança... mudar tipo de subclasse

2 respostas
marcos.junqueira

Olá pessoal,

estou com uma dúvida e talvez alguém possa me ajudar. Tenho a seguinte estrutura: Usuario herda de Pessoa, Atendente e Supervisor herdam de Usuario. Fiz o mapeamento no hibernate usando joined-subclass. Até aqui tudo bem, o problema acontece quando tentamos promover um atendente para supervisor.
Não funciona porque um supervisor não é um atendente, claro.
Gostaria de saber se mudar o mapeamento dessa forma, será possivel a partir de um atendente existente salvar um supervisor? e a partir de um supervisor existente rebaixá-lo à atendente?

Pensei em usar um descriminador em usuário para definir o tipo de subclasse de usuário, mas será que vou conseguir mudar um usuario de atendente para supervisor? como?

Pra complicar mais um pouco ainda preciso manter o histórico desses rebaixamentos e promoções. E me confirmem, não posso fazer o histórico na mesma tabela certo? Segundo meu gerente não, tem que ser na mesma tabela e eu vejo isso como problema.

Se alguém tiver alguma idéia, toda ajuda é bem vinda…

até mais.

2 Respostas

felipealbuquerque

Se o Atendente não tiver atributos que o Supervisor não tenha e vice-versa, e os métodos das classes forem os mesmos, apenas com alterações nas implementações, um usuário pode ter, por exemplo, o Papel de atendente ou supervisor, e não ser, especificamente, um supervisor ou um atendente.
Por exemplo, dado que:

public class Usuario extends Pessoa {
    // atributos e métodos
}

Podemos alterar o código:

public class Atendente extends Usuario {
    // atributos e métodos
}
public class Supervisor extends Usuario {
    // atributos e métodos
}

Para:

public interface PapelUsuario {
    // métodos da interface
}
public class Atendente implements PapelUsuario {
    // implementações
}
public class Supervisor implements PapelUsuario {
    // implementações
}
public class Usuario extends Pessoa {
    private PapelUsuario papel;
    // atributos e métodos
}

Dessa maneira, a classe Usuario pode obter os comportamentos de supervisor ou atendente, e esse comportamento pode ser alterado em Runtime.

marcos.junqueira

Felipe,

a solução é muito boa, mas infelizmente atendente e supervisor tem atributos diferentes. E depois podem surgir novas entidades como suporte e administrador.

Vou ver se consigo evoluir um pouco a ideia e se resolver posto a solução aqui.

Criado 6 de março de 2008
Ultima resposta 6 de mar. de 2008
Respostas 2
Participantes 2