Preciso persistir pessoas físicas, pessoas jurídicas, fornecedores e outras classes que não influenciam na minha dúvida. Uma classe X qualquer possui 1 fornecedor. 1 fornecedor possui atributos próprios, e pode ser pessoa fisica ou pessoa juridica (esse ‘ou’ é exclusivo (XOR)).
Fiz a implementação do Modelo como abaixo (retirei as anotações do Hibernate p/ simplificar):
interface IPessoa {…}
interface IFornecedor extends IPessoa {…}
class X {
IFornecedor fornecedor;
…
}
class Pessoa implements IPessoa {…}
class PessoaFisica extends Pessoa {…}
class PessoaJuridica extends Pessoa {…}
class FornecedorPessoaFisica extends PessoaFisica implements IFornecedor {…}
class FornecedorPessoaJuridica extends PessoaJuridica implements IFornecedor {…}
Dúvidas:
O modelo está bom? Sugestões, críticas, dicas, design patterns?
Caso esteja OK, dá para fazer a persistência desse modelo sem problemas? A dúvida é como fazer isso, já que IFornecedor é uma Interface, e não uma classe concreta. No manual “hibernate_annotations.pdf” (http://www.hibernate.org/hib_docs/annotations/reference/en/pdf/hibernate_annotations.pdf), página 12, Cap.: 2.2.4. tem dizendo: “Annotating interfaces is currently not supported.”
Por exemplo, quero persistir um FornecedorPessoaFisica / FornecedorPessoaJuridica e usar "select f from IFornecedor f where … " para me retornar o FornecedorPessoaFisica / FornecedorPessoaJuridica correspondente…