MySQL, Foreign Key e DAO + Elegância! É possível?  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá GUJ's.....

Estou criando um DAO chamado ServicoPrestadoDAO, e me surgiu uma dúvida. Na base de dados a tabela ServicoPrestado tem um relacionamento com a tabela empresa à partir do CNPJ. Por isso criei o FK usando o ALTER TABLE. A minha dúvida inicial é a seguinte:

Quando eu for criar um novo serviço prestado e passar um cnpj de uma empresa que não existe no meu banco será lançado uma exceção? Ou seja, o banco de dados deve barrar a entrada deste registro ou não? Será que eu terei que implementar esta consistência no próprio código do DAO?

Bom, eu fiz alguns testes, e parece que vou ter que fazer esta consistência no DAO mesmo, mas acho q o banco deveria cuidar disso, e não meu DAO. Fica muito deselegante e vai poluir muito meu código. Será que estou fazendo algo errado, o MySQL não suporte isso ou nenhum banco suporta?

O Script SQL segue abaixo:



Desde já agradeço!
Thiago Senna

This message was edited 1 time. Last update was at 08/07/2005 23:07:20

[Email]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

O MySQL normalmente não faz esse tipo de testes (porque as tabelas são, por default, MyISAM, que ainda não suporta isso), mas usando tabelas InnoDB (as que você está usando) e criando os índices manualmente você consegue fazer o banco lidar com isso normalmente. Use uma ferramenta, como o DbDesigner ou vá lá na documentação ver como declarar a criação de índices.

Mas porque você não pode fazer isso no seu Dao? Vai ser só uma linha, pra ver se a propriedade empresa está null, não?

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá Maurício

Maurício Linhares wrote:e criando os índices manualmente você consegue fazer o banco lidar com isso normalmente


Humm.. pelo jeito naum venho mechendo com isso... Vou seguir seu conselho! Nem sei o que é índice! Mas já fico contente em saber que o banco pode cuidar disso pra mim!

Maurício Linhares wrote:Use uma ferramenta, como o DbDesigner ou vá lá na documentação ver como declarar a criação de índices.


Mas porque você não pode fazer isso no seu Dao? Vai ser só uma linha, pra ver se a propriedade empresa está null, não?

Só verificar se está nulo? Bom, o que pretendo garantir é que a empresa exista no banco, entaum eu precisaria de algo do tipo



É, até que é pequeno, até que posso colocar isso no dao numa boa... mas particularmente prefiro que o banco faça isso.

Valeu Maurício.. Com essas suas colocações já deu pra ajudar bastante!
Thiago Senna

This message was edited 1 time. Last update was at 08/07/2005 23:23:38

[Email]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Índice

Foreign Keys no MySQL

Referência do InnoDB

No caso da validação do Dao, eu acho que o "ServiçoPrestado" nem deveria chegar no Dao se já não tivesse uma empresa nele, ele já deveria ter sido validado antes disso, o seu Dao deve receber tudo limpinho e bonitinho. Pelo que você falou, ter uma empresa em um "ServiçoPrestado" parece ser uma regra de negócio, se é regra de negócio, deveria ter sido validado na camada de negócio, não no Dao ou no banco de dados.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá!

Maurício Linhares wrote:ter uma empresa em um "ServiçoPrestado" parece ser uma regra de negócio, se é regra de negócio, deveria ter sido validado na camada de negócio, não no Dao ou no banco de dados.


Realmente Maurício, é uma lógica de negócio. No meu modelo nem sei se devo chamar esta relação entre empresa e serviço prestado como relacionamento.

Na verdade eu tenho um ServiçoPrestado que possui uma empresa cliente ( a qual contratou o serviço). O relacionamento no meu modelo acontece entre a empresa e o serviço prestado através da empresa que forneceu o serviço.

Bom... deixe-me ser mais direto e encher menos linguiça!
A classe empresa possui uma coleção de serviços prestados, e dentro da classe serviços prestados possuir uma referência para a empresa que contratou o serviço.

O que eu quero garantir é que serviço prestado não seja persistido caso a empresa que contratou o serviço não exista na base de dados, e não o caso desta empresa que cadastrou o serviço estar nula. É quanto a este tipo de responsabilidade é que quero saber se o BD garante pra mim com a Foreign Key.

Maurício,

Já baixei o DBDesigner, e já vi que vai valer a pena. Também vou estudar os links que você me indicou. Com a ajuda que q você deu já deu para me orientar e por isso vou continuar com o MySQL mesmo no meu projeto de final de curso.

Observação:
Pena que tabelas do tio MyISAM não suportam o relacionamento ainda. Seria muito bom usá-las para rodar os testes unitários, já que são mais rápidas.


Abraços!
Thiago Senna
[Email]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Thiago,

Em que hipotese voce teria um CNPJ invalido? Voce esta pegando o que o usuario digitou e colocando como foreign key?

Se não, não teria, num caso normal, você ter um CNPJ invalido, ja que ele viria de uma lsita

Se sim, voce tem que fazer essa validação quando o usuario inserir o dado, se nao estiver cadastrado rejeite, ou cadastre, sei la



[]s


Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

pcalcado wrote:
Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS


Na boa Shoes, eu tava lutando pra fazer o Commons Validator funcionar no Spring, mas vou pegar um cineminha pra descansar, ninguém merece...

Vai dar um passeio também, eu espero que funcione pra mim

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá!

Philip wrote: Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS


Maurício wrote: Na boa Shoes, eu tava lutando pra fazer o Commons Validator funcionar no Spring, mas vou pegar um cineminha pra descansar, ninguém merece...


Eu wrote:To de férias da faculdade e estou fazendo o trabalho de final de curso. Comecei as 10:00 e fui até as 17:50. Recomecei o trabalho às 21:00. Estou tentando prever coisas que nunca irão acontecer.


Mudando de assunto...

Philip wrote: Se não, não teria, num caso normal, você ter um CNPJ invalido, ja que ele viria de uma lsita


Humm... Verdade... Essa é aquela maldita mania que assombra todo programdor, que é ficar evitando possibilidades que nunca acontecerão!

Abraços!
Thiago Senna

This message was edited 2 times. Last update was at 09/07/2005 22:02:20

[Email]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Maurício,

Obrigado pela informação sobre o InnoDB, temos uma aplicação cujo banco já estávamos pensando em mudar para PostgreSQL por que não conseguíamos criar chaves estrangeiras no MySQL. Só uma pergunta: que impactos eu teria se mudar o bd de MyISAM para InnoDB? Resumidamente você saberia as diferenças? Os perigos? Meu colega tá tentando já converter o banco, mas não tá funfando...
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

A única diferença é que o InnoDB garante mesmo a integridade referêncial por chaves estrangeiras, o que pode estar causando problemas no seu sistema, pode ter alguma coisa que está "quebrando" a integridade dele.

Se você já tem um sistema que roda normalmente com MyISAM, continue usando ele, porque ele é bem mais rápido que o InnoDB, se ainda tá começando, faça tudo em InnoDB.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

O sistema tá funfando, mas temos que escolher o banco. Meu colega acabou de informar que conseguiu converter. Não dá pra usar MyISAM porque acho muito necessário que o banco possua integrigade referencial, tornando-o muito mais consistente. Valeu! Obrigado!
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Aliás, foi tu que escreveu o tutorial do Hibernate 3? Li uma parte em casa, tá legalzinho, parabéns!
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

renato3110 wrote:Aliás, foi tu que escreveu o tutorial do Hibernate 3? Li uma parte em casa, tá legalzinho, parabéns!


Valeu

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá Renato,

Quando mudei minha base para InnoDB, uma coisa que me deu uma dor de cabeça e tanto é que nos meus testes unitários haviam um comando truncat nas minhas tabelas.

tipo



Esse comando não pode ser usando em tabelas do tipo InnoDB, ou pelo menos, naum pode ser usado durante uma transação!


Abraços!
Thiago Senna
[Email]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Obrigado Thiago pela dica. Vou ficar de olho pra ver se esse InnoDB vai se comportar bem hehe. Pelo menos até agora tá legalzinho. O que seria esse truncate? É um comando SQL?

Um problema que já verifiquei e que pode ser por causa da migração para InnoDB é que o MS Access dá um erro fatal quando eu tento exportar tabelas para o MySQL via ODBC, o que antes não acontecia.
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team