[db4o] Unique constraints

Olá,

alguém sabe como eu faço a integridade dos dados no db4o ? O campo não pode ser null, e tem que ser único … essas coisas.

Pra criar um índice, veja o capítulo 14 da documentação (Indexes), mas esse negócio de “não nulo” não existe no Db4o, isso tem que ser implementado por você, ele não faz nenhum controle sobre esse tipo de coisa, até porquê não existe integridade referêncial em um modelo de objetos, ou você aponta pra alguém ou aponta pra nulo, não dá pra apontar pra uma coisa que não existe ou pra a coisa errada.

Se você está procurando por “chaves únicas” pros seus objetos, você pode utilizar os próprios IDs do Db4o, veja o capítulo 15 da documentação, ele fala sobre os identificadores únicos.

E ai Maurício, blza?

Então, para o banco não apresentar inconsistências, como duplicação de registro, etc… tenho que validar na aplicação, né isso ?

Por exemplo, para incluir um registro, faço uma busca no registro e a depender do resultado, insiro ou não no banco…

De qualquer forma, o que estou querendo é saber quem trata erros de pk e fk, se eu tenho uma pessoa onde a pk é o cpf, e essa pessoa tem uma fk para endereco, quem trata as validações referentes a isso ? a aplicação ?

Acho q eles poderiam se basear no equals e no hashCode do objeto para saber isso.

Fabrício,

Não existem inconsistências de chaves porque não existem chaves no Db4o, não existem duplicações de registros nem referenciamento de “entidades” incorretas, isso não é um banco relacional. É melhor você esquecer todos os seus conceitos de acesso e uso de bancos de dados relacionais, porque praticamente nenhum deles existe, já que a maioria dos problemas de integridade de dados não acontece em um banco orientado a objetos de verdade.

A duplicação de registro não acontece porque o Db4o sabe quais objetos já foram persistidos e quais não foram, então se você pegar um objeto em uma busca, fizer uma alteração nele e enviar ele pro banco, o banco vai saber que aquilo é um update e não um insert.

Leia a documentação direitinho que você vai entender melhor como ele funciona.

Eu rodei uns exemplos aqui, modificando os mesmos, e em uma mesma execução tentei inserir duas vezes o mesmo objeto, e o mesmo foi inserido, então o que você falou que ele não insere de novo e sim atualiza está errado. Você poderia me dizer como você fez isso ? Porque pelo que eu vi, você teria que enviar uma mensagem perguntando se o resgistro existe e a depender do retorno incluir ou não, isso foi o q eu vi, mas pode postar aqui, se você viu de uma forma mais transparente… :wink:

Você enviou um objeto “não persistente” pro banco, carregou esse objeto denovo, alterou seus dados e reenviou pro banco e o banco não atualizou, inserindo um novo registro?

Você tem um código que faça isso explicitamente?

Na verdade eu instanciei dois objetos iguais, com os mesmos valores para os atributos. por ex.:

Pessoa joao = new Pessoa(“joao”,“M”,1,new DataNascimento(“30/04/1980”));
Pessoa joaoDuplicado = new Pessoa(“joao”,“M”,1,new DataNascimento(“30/04/1980”));

e persisti primeiro joao, blza …
depois fui persistir joaoDuplicado, e ai ele deixou, qto na verdade não deveria deixar … ou queria saber se isso quem tem que validar é a aplicação e não o BDOO …

O código não está aqui comigo agora, mas basicamente é pegar os objetos e dar um set no db.

Isso são objetos diferentes, só seria o mesmo objeto se você persistisse o primeiro e depois carregasse ele do banco, alterasse e mandasse outra vez pro banco.

Do jeito que você está fazendo não tem como ele saber não, porque não existem chaves únicas nele. Quem tem que validar se existem objetos que tenham as mesmas informações no banco é a aplicação e não o banco.

Pra mim não são totalmente diferentes, pois quem rege a política de igualdade dos objetos é o equals+hashCode (lembrar do operador ==, e do equals), logo o db4o poderia ter algum artifício que me facilitasse, não tendo que fazer toda hora verificações. Entendeu ? Isso é um pouco chato, verificar … e se o programador por algum desvio falhar em uma dessas verificações ? Acho que ainda o SGBDOOs poderiam aprimorar essas características.