Qual seria a melhor solução de modelagem para esse requisito?

Ola, estou modelando um sistema de gestao simples. Na modelagem do Cliente/Fornecedor foi feito o padrao, Pessoa, Pessoa Fisica e Pessoa Juridica. Até nesse ponto tudo bem. O problema que eu estou tendo na modelagem é que o cliente e o fornecedor podem ser pessoa fisica ou pessoa juridica. Esse é o primeiro questionamento. O segundo seria utilizando JPA qual seria a melhor estrategia para persistencia, multiplas tabelas ou unica tabela?

A grosso modo tinha pensando em criar o padrao, com cliente herdando pessoafisica e fornecedor pessoajuridica. Sem usar a estrategia de heranca, modelando as entidades separadas Fornecedor e Cliente o campo CNPJ/CPF e INSCEST/RG seria outra solucao, mas vai complicar na hora de fazer a modelagem do contas a receber pois tera contas a receber tanto de cliente como de fornecedor e modelando como pessoa fica mais simples os relacionamentos.

Alguem tem alguma opiniao ou ja passou por esta situacao?

grato.

Cara, você poderia fazer da seguinte forma:

Cria uma classe Pessoa, cria Cliente e Fornecedor que estende de Pessoa. Cria uma classe abstrata Doc e as classes PessoaFisicaDoc e PessoaJuridicaDoc filhas de Doc. Essa classe Doc vai ter o que é comun aos documentos e a pessoafisica o que é especifico de pessoa fisica e a jurídica o que é específica de jurídica. Coloquei um método abstrato em doc chamado ‘validar’. PessoaFisicaDoc vai estender de Doc e vai implementar a lógica de validação do documento da pessoa Física e o mesmo acontece para pessoa jurídica só que para CNPJ, CACEAL, ou qualquer outros documentos associados a pessoa jurídica.

Para explicar melhor a abaixo vai um simples diagrama de classes e os códigos das classes. Lembrando que estão incompletos sendo apenas para uma melhor visualização de como ficaria. As implementações finais devem ter os métodos e atributos pertinentes a cada classe.

Da forma modelada abaixo, atende ao requisito pois um cliente pode ser pessoa fisica ou juridica e fornecedor pode ser fisica ou juridica o que vai definir vai ser a implementação de DOc que vai estar em Pessoa. Veja abaixo e espero que dê pra entender melhor!

Com relação a tabela no banco de dados, o cpf ou cnpj seria persistido em uma coluna numDoc ai vc poderia colocar um flag identificando o tipo de pessoa, fisica ou juridica.

Espero que tenha ajudado, e qualquer coisa manda as ordens!

Diagrama de classes

Classes Java

public class Pessoa {
	
	
	private Doc doc;
	
	/*
	 * private ...
	 * private ...
	 * private ...
	 * 
	 * Mais os outros atributos referentes a pessoa
	 */
	
	
	public Pessoa(){
		//
	}

	public Doc getDoc() {
		return doc;
	}

	public void setDoc(Doc doc) {
		this.doc = doc;
	}
	

}
public class Cliente extends Pessoa{
	
	/*
	 * atributos referentes a cliente
	 */
	
	  public Cliente(){
		  //
	  }
	  
	  /*
	   * sets e gets
	   */

}
public class Fornecedor extends Pessoa{
	
	/*
	 * atributos referentes a fornecedor
	 */
	
	  public Fornecedor(){
		  //
	  }
	  
	  /*
	   * sets e gets
	   */

}
public abstract class Doc {
	
	private String numDoc;//número do documento independente de ser cpf ou cnpj. Na tabela tb seria num_doc
	
	public Doc(){
		//
	}
	
	//Cada tipo de documento vai implementar a sua validação específica.
	//Esse método poderia ser tb ao ínves de retornar um boolean retornar void e 
	//lançar uma exception caso seja o documento inválido. Por exemplo InvalidDocumentExcpetion
	public abstract boolean validar();

}
public class PessoaFisicaDoc extends Doc{
	
	/*
	 * atributos referentes ao documento de pessoa fisica
	 */
	
	public PessoaFisicaDoc(){
		//
	}
	
	/*
	 * sets e gets
	 */
	

	public boolean validar() {
		return true;//implementação da lógica de validação de cpf
	}

}
public class PessoaJuridicaDoc extends Doc{

	/*
	 * atributos referentes ao documento de pessoa jurídica
	 */
	
	public PessoaJuridicaDoc(){
		//
	}
	
	/*
	 * sets e gets
	 */
	
	public boolean validar() {
		return true;//implementação da lógica de validação de cnpj
	}
	
}

Victor Lindberg