Olá,
Criei uma tabela no banco chamada Pessoas, que tem um relacionamento muitos para um com a tabela
Bairros, para testar os JPAControllers gerados pelo Netbeans, a partir de classes de entidade.
Bom, o PessoaJpaController, na inserção, funciona perfeitamente se e somente se o a instância de Pessoa
passada para o método tiver um nome (not null), e tiver um bairro (já cadastrado no banco). Não tendo esses requisitos,
é disparada uma Exception.
Perguntas:
- Um DAO deve tratar exceções, como violações de constraints, se o registro não existe (edição ou deleção), ou apenas
lançá-las para quem usar o DAO? - Tenho uma aplicação pequena, com umas 7 tabelas. Seriam então 7 DAOs, obviamente. Devo criar uma interface para cada DAO
com os métodos da classe DAO concreta, e usar somente a interface?
Outra Questão: Vejam só o tamanho do método create de um JPAController gerado pelo Netbeans, de uma classe Diaria, que tem os vínculos:
muitos para um com tabela Funcionario
um para muitos com tabela Documento Fiscal
um para muitos com tabela Certificados
muitos para um com tabela Cidade
public void create(Diaria diaria)
{
if (diaria.getDocumentoFiscalCollection() == null)
{
diaria.setDocumentoFiscalCollection(new ArrayList<DocumentoFiscal>());
}
if (diaria.getCertificadoCollection() == null)
{
diaria.setCertificadoCollection(new ArrayList<Certificado>());
}
EntityManager em = null;
try
{
em = getEntityManager();
em.getTransaction().begin();
Funcionario funcionario = diaria.getFuncionario();
if (funcionario != null)
{
funcionario = em.getReference(funcionario.getClass(),
funcionario.getId());
diaria.setFuncionario(funcionario);
}
Cidade cidade = diaria.getCidade();
if (cidade != null)
{
cidade = em.getReference(cidade.getClass(), cidade.getId());
diaria.setCidade(cidade);
}
Collection<DocumentoFiscal> attachedDocumentosFiscaisCollection =
new ArrayList<DocumentoFiscal>();
for (DocumentoFiscal documentosFiscaisCollectionDocumentoFiscalToAttach :
diaria.getDocumentoFiscalCollection())
{
documentosFiscaisCollectionDocumentoFiscalToAttach = em.getReference(
documentosFiscaisCollectionDocumentoFiscalToAttach.getClass(),
documentosFiscaisCollectionDocumentoFiscalToAttach.getId());
attachedDocumentosFiscaisCollection.add(
documentosFiscaisCollectionDocumentoFiscalToAttach);
}
diaria.setDocumentoFiscalCollection(
attachedDocumentosFiscaisCollection);
Collection<Certificado> attachedCertificadosCollection = new ArrayList<Certificado>();
for (Certificado certificadosCollectionCertificadoToAttach :
diaria.getCertificadoCollection())
{
certificadosCollectionCertificadoToAttach = em.getReference(
certificadosCollectionCertificadoToAttach.getClass(),
certificadosCollectionCertificadoToAttach.getId());
attachedCertificadosCollection.add(
certificadosCollectionCertificadoToAttach);
}
diaria.setCertificadoCollection(attachedCertificadosCollection);
em.persist(diaria);
if (funcionario != null)
{
funcionario.getDiariaCollection().add(diaria);
funcionario = em.merge(funcionario);
}
if (cidade != null)
{
cidade.getDiariaCollection().add(diaria);
cidade = em.merge(cidade);
}
for (DocumentoFiscal documentosFiscaisCollectionDocumentoFiscal :
diaria.getDocumentoFiscalCollection())
{
Diaria oldDiariaOfDocumentosFiscaisCollectionDocumentoFiscal =
documentosFiscaisCollectionDocumentoFiscal.getDiaria();
documentosFiscaisCollectionDocumentoFiscal.setDiaria(diaria);
documentosFiscaisCollectionDocumentoFiscal = em.merge(
documentosFiscaisCollectionDocumentoFiscal);
if (oldDiariaOfDocumentosFiscaisCollectionDocumentoFiscal != null)
{
oldDiariaOfDocumentosFiscaisCollectionDocumentoFiscal.getDocumentoFiscalCollection().remove(
documentosFiscaisCollectionDocumentoFiscal);
oldDiariaOfDocumentosFiscaisCollectionDocumentoFiscal = em.merge(
oldDiariaOfDocumentosFiscaisCollectionDocumentoFiscal);
}
}
for (Certificado certificadosCollectionCertificado : diaria.getCertificadoCollection())
{
Diaria oldDiariaOfCertificadosCollectionCertificado =
certificadosCollectionCertificado.getDiaria();
certificadosCollectionCertificado.setDiaria(diaria);
certificadosCollectionCertificado = em.merge(
certificadosCollectionCertificado);
if (oldDiariaOfCertificadosCollectionCertificado != null)
{
oldDiariaOfCertificadosCollectionCertificado.getCertificadoCollection().remove(
certificadosCollectionCertificado);
oldDiariaOfCertificadosCollectionCertificado = em.merge(
oldDiariaOfCertificadosCollectionCertificado);
}
}
em.getTransaction().commit();
}
finally
{
if (em != null)
{
em.close();
}
}
}
Que método inserir enorme, não? O método editar é maior ainda
- Pergunta: isso é o mínimo necessário para inserir uma Diaria corretamente? Pode-se reduzir esse método?
- Nunca encontrei um site com exemplos de DAOs JPA/Hibernate com tabelas com chaves estrangeiras, somente
com tabelas simples. Sabem alguns sites?
obrigado pela atenção
Juliano