Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida Em Uma herança mais complicada na Vida Real

Olá a todos!! tenho uma situação envolvendo herança e Jpa e gostaria que me ajudassem. Desenvolvi um sistema de cadastro de processos de contratação(licitação, contratação direta,srp e contrato) onde esses processos seguem um fluxo, onde o órgão envia o procedimento para o escritório de advocacia e o escritório devolve o processo com as devidas correções que devem ser feitas(revisão). O problema é que licitação, contração direta, registro de preço e contrato são entidades distintas mas todas elas são ter uma lista de revisões

Public class Licitacao{
Long licitcaoId;
String numero;
String ano;
String objeto
//outros atributos…
}

Public class ContratacaoDireta{
Long contratacaoDiretaId;
String numero;
String ano;
String objeto;
TipoContratacaoDireta tipoContratacao;
Licitacao licitacao;
//outros atributos
}

public class SRP{
Long srpId;
Private String numero;
Private String ano;
Private TipoAdesao tipoAdesao;
Private Licitacao licitacao;
//outros atributos
}

Public class Contrato {
Long contratoId;
String ano;
Private String numero;
//derivado de licitação, srp ou contratação direta
Private TipoContrato tipoContrato
//outros atributos
}

O problema é que cada uma destas classes acima poderão ter uma revisão associada, O JPA define várias estratégias de herança, no primeiro caso eu poderia ter uma única tabela de revisão,mas essa tabela não vai ser normatizada ela ia ter os 4 campos(licitação_id,srp_id,contratação_direta_id,contrato_id) e ainda teria o discriminador A estratégia de joined onde vou ter a tabela mãe (revisão) e as tabelas filhas(revisão_licitacao, revisão_srp,etc...) que do ponto de vista do sgbd é o ideal, mas já lique posso ter problemas de performance E a terceira que cada entidade vai representar uma tabela no banco de dados(*essa foi a implementaçao escolhida), a principio me pareceu a mais equilibrada, mas mesmo assim me incomoda bastante ter que criar as 4 entidades para cada tipo de revisão existente: RevisaoLicitacao,RevisaoContratacao,RevisaoSrp,RevisaoContrato, já que as classes são exatamentes iguais e só muda o objeto de origem

Class RevisaoLicitacao{
Integer id;
Licitacao licitação;
String texto;
}
Class RevisaoSrp{
Integer id;
Srp srp;
String texto;
}

Como todos os procedimentos tem numero/ano eu pensei em criar uma classe Processo e fazer com que Licitação,Srp,Contratação e Contrato herdassem de processo, ai eu teria apenas uma tabela de revisão ligada pelo processo_id, mas ai eu teria joins entre processo e as classes filhas podendo resultar em uma situação pior que a anterior. Vocês acham que segui o caminho correto? Como poderia melhorar o design dessa modelagem OO sem perder performance de banco de dados? Se for possível nesse caso como poderia utilizar composição no lugar da herança?

4 respostas

Oi Ricardo,

dado que as revisão são sempre iguais, por que não referenciá-las da revisão, em vez do contrário? A sugestão é usar uma entidade simples Revisao com seu id como chave primária:

public class Revisao {
    Long id;
    String texto;
}

E os processos terão um atributo do tipo Revisao, usando a composição aqui, em vez de herança:

public class SRP{
    //outros atributos
    private Revisao revisao;
    ...
}

Ele vai criar uma coluna revisao_id para joins futuros, padrão.

Em tempo, por favor evite fazer perguntas de assuntos não relativos ao assunto do curso em seu fórum. Um local mais apropriado para essa questão teria sido no curso de JPA2 ou diretamente no GUJ, onde uma comunidade muito maior de desenvolvedores observa e responde questões.

bom não tem haver exatamente com o exercício, mas tem haver com o assunto e nos próprios exercícios nos é perguntado sobre nossas experiências reais então eu achei que não teria problema, mas tudo bem. Obrigado pela resposta, o problema é que uma SRP pode ter uma ou várias revisões

solução!

Bom, nesse caso, você pode ter a classe SRP com uma lista de revisões, em vez de apenas uma. :-)

public class SRP {
    //outros atributos
    private List<Revisao> revisoes;
    ...
}

boa noite Cecilia , como o srp, contratação direta, contrato e licitação tem um atributo número e outro atributo ano eu mapeei a revisão com chave composta, meio antiquado mas tá funcionando :), obrigado pelas respostas.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software