Boa tarde a todos. Estou construindo um sistema na seguinte forma: tenho as classes Pessoa, PessoaFisica, PessoaJuridica, Aluno, Fornecedor.
Aluno herda de PessoaFisica e esta herda de Pessoa. Fornecedor herda de PessoaJuridica e esta herda de Pessoa.
Ao construir o banco de dados utilizei os ids para relacionar tabelas com herança (PessoaFisica contém um id para Pessoa, por exemplo) e a partir daí surgiu meu problema. Ao construir as classes DAO para o aluno, por exemplo, alguns métodos de seleção de dados ficaram repetidos.
Por exemplo, uma Pessoa possui um nome, eu posso fazer o select via nome. Um aluno não possui um nome diretamente na tabela, mas ele faz referencia a uma PessoaFisica e esta faz referencia a uma Pessoa, logo um aluno possui um nome devido a herança. Devido a isso, minha classe PessoaDAO possui um método de busca pelo nome e minha classe AlunoDAO também possui um método de busca pelo nome, sendo que estes métodos possuem um script sql diferente associado.
Script Pessoa
select * from pessoa where nome like ?'%' order by nome
Script Aluno
select * from pessoa where nome like ?'%' inner join pessoaFisica where pessoaFisica.idPessoa = pessoa.idPessoa inner join aluno where aluno.idPessoaFisica = pessoaFisica.idPessoaFisica order by nome
A minha dúvida é se isso está correto ou se estou cometendo algum erro conceitual em relação a herança ou algo assim.
Bom dia,
o contexto parece-me correto e adequado, o result set do seus selects vão conter o que você almeja de informação em cada DAO, mas qual o intuito de fazer um DAO para pessoa, se uma pessoa é inevitavelmente física ou jurídica?
Bom, o intuito é somente utilizar o método nos outros DAOs. Imagine a seguinte situação: quero fazer um insert de um aluno. Como o aluno é uma pessoa física e também uma pessoa, logo eu tenho que fazer inserção em pessoa física e em pessoa. Para resolver isso, no método insert do AlunoDAO, antes de inserir um aluno propriamente dito eu insiro uma pessoa física da seguinte forma PessoaFisicaDAO.insert(aluno); Com isso, os dados pertencentes a toda pessoa física são inseridos na tabela de pessoas físicas. O mesmo acontece para pessoa física, quando vou fazer o insert de uma pessoa física, utilizo o método PessoaDAO.insert(pessoaFisica);
Como existe também a pessoa jurídica, é mais fácil existir este método em PessoaDAO do que replicar o código para ambas as classes, entendeu?
Em relação a isso, eu também tenho outra dúvida. Quando eu vou inserir um aluno, perceba que existem 3 inserções associadas (pessoa, pessoa física e por fim aluno), quando eu faço algo neste sentido, eu não estou quebrando a atomicidade das operações com o banco de dados? Se meu servidor der um problema durante um inserção de um aluno, posso acabar inserindo uma pessoa ou pessoa física e não associá-la a nenhum aluno. Isso é normal? Ou existe algum mecanismo que desconheço para tratar disso?
Thiago boa noite,
sobre a sua aplicação achei estranho a inserção de um aluno leva em conta a inserção de Pessoa,
inserir Pessoa Física ou Jurídica e depois o aluno, concordo é viável e faz sentido, entretanto no caso da atomicidade com o banco de dados esse problema pode realmente ocorrer e vai ocorrer caso não seja tratado, para resolver seu problema você pode usar JTA no seu projeto que é uma api para controlar transações entre aplicações, visando algo maior em seu projeto, mas caso esteja apenas tentando efetuar um controle de transação simples onde atomicidade seja garantida pelo banco de dados você pode fazer algo como o código abaixo:
try {
//Considere q eu já tenha declarado e instânciados meus objetos necessários
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement( "INSERT INTO mytable (name, age) VALUES (?, ?)" );
int result = preparedStatement.executeUpdate();
connection.commit();
} catch( Exception e ) {
connection.rollback();
}
fala Thiago bom, então cara, a meu ver a classe pessoa pode ser abtract, nela conterá nome idade, etc como atributos, a Fornecedor herda de pessoa pq este será uma pessoa, contendo CNPJ como atributo e aluno contendo CPF.
Pois bem, eu não usaria JPA como o amigo ali de cima disse pq na minha humilde opinião: Aplicação é uma coisa, Estrutura é outra.
Agora com tudo isso vc monta seu banco.
Opa, obrigado pelas respostas. Acabei por abandonar esta forma de implementação, estou aprendendo a utilizar Hibernate com JPA. E já estou implementando utilizando as transações.