Bom dia.
Eu tenho uma entidade Pessoa, que hoje ela está ligada com PessoaFisica e PessoaJuridica através de um mapeamento @OneToOne:
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa", orphanRemoval = true, fetch = FetchType.LAZY)
private PessoaFisica pessoaFisica;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa", orphanRemoval = true, fetch = FetchType.LAZY)
private PessoaJuridica pessoaJuridica;
E ainda essa classe Pessoa, ela pode ser um Cliente, Fornecedor, Transportadora, Vendedor ou vários deles ao mesmo tempo e hoje também estão mapeados como @OneToOne:
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa", orphanRemoval = true, fetch = FetchType.LAZY)
private Cliente cliente;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa", orphanRemoval = true, fetch = FetchType.LAZY)
private Fornecedor fornecedor;
As filhas estão compartilhando o id da Pessoa e utilizam um @MapsId. Dessa forma:
@Id
@Column(name = "id", nullable = false)
private Integer id;
@MapsId
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "id")
private Pessoa pessoa;
Qual seria a melhor maneira e mais elegante de se mapear estas classes, para que eu não tenha que cair no problema de Extra Queries, pois várias regras em meu Controller são executadas e aplicadas dependendo de cada uma dessas “relações” e gostaria de buscar e executar as queries apenas do que realmente vou trabalhar para a Pessoa em questão.
Obrigado.