db4o - Chave Primária

6 respostas
antoniojr.guj

Olá users guj!

Bem, estou me aventurando pelo DB4O. Logo, gostaria de saber como funciona o conceito de chave primária neste Banco de Objetos. Tenho encontrado dificuldades em encontrar conteúdo sobre manipulação nesse banco.

Por exemplo, no meu projeto a chave primária é o Chassi do veículo. No meu código, eu tenho que analisar naTORAlmente se no db4o já existe o chassi que o usuário está tentando cadastrar? Conhece alguma forma de adicionar índices ou chaves aos meus campos?

Agradeço sua ajuda desde já…

6 Respostas

fabiomedeirosf

Então Antônio, fiz umas brincadeiras com o db4o, e no início tive a mesma dúvida.

Ao ler algumas documentações, tutoriais logo percebi que quando trabalhamos com banco OO a relação não é feita por um PK como estavamos acostumados e sim pela referencia do objeto, logo, usei apenas a referência, e funcionou certinho. Fica até mais fácil pra manipular, embora, mais difícil num primeiro momento para entendermos o conceito.

A princípio foi isto que entendi, não te asseguro também 100% de que é desta forma que funciona, mas como disse, até onde executei, apenas o relacionamento das referencias dos objetos funcionaram certinho.

antoniojr.guj

Ótimo fabiomedeirosf!

Mas, como então você faz essa relação? Uma PK não pode se repetir… Logo, a sua solução foi a mesma pensada por mim? Verificar em todo o banco se a minha referência já existe de forma manual?

Poderia, se possível, colocar um exemplo?

Grato!

fabiomedeirosf

Então pra fazer essa verificação usei aquela QueryByExample, onde por exemplo, quero verificar se uma pessoa ja está cadastrada, num exemplo simples:

Pessoa pessoa = new Pessoa();
pessoa.setNome("nomeQueIraSerCadastrado");

ObjectSet result = db.queryByExample(pessoa);

Ai verifico se foi retornado algo. Pode ser que hajam soluções melhores.
Atributo ao objeto os atributos que nao devam constar repetidos, que pensando em banco relacional, os que sao unique ou que possuem uma constraint qualquer.

antoniojr.guj

Bem, foi exatamente assim que eu pensei…

Só que tenho a mesma dúvida que você:

Grato, fabiomedeirosf!

Mas, continuo na expectativa de uma alternativa…

fabiomedeirosf

Verificando algo, poste aí.

B

Nossa, o post tem tanto tempo que nem sei se já achou a resposta, mas qualquer coisa fica registrada caso mais alguém precise.
Dada a seguinte classe:

class Veiculo {

    private Long chassi;
    // outros detalhes da classe.

}

Para tornar o atributo chassi único no Db4o, basta configurar a classe em um objeto Configuration, da seguinte forma:

EmbeddedConfiguration configuracao = Db4oEmbedded.newConfiguration();

// Primeiro deve-se indexar o atributo.
configuracao.common().objectClass(Veiculo.class).objectField("chassi").indexed(true);

// Depois criar a restrição de unicidade nele.
configuracao.common().add(new UniqueFieldValueConstraint(Veiculo.class, "chassi"));

Agora ao salvar uma instância de Veiculo, se o valor do chassi já existir no banco, será lançada uma UniqueFieldValueConstraintViolationException.

EmbeddedObjectContainer container = Db4oEmbedded.openFile(configuracao, NOME_DO_BANCO);
try {
    container.store(instanciaComValorDeChassiDuplicado);
    container.commit();
} catch (UniqueFieldValueConstraintViolationException e) {
    // Sabe-se que a "chave primária" foi violada...
} finally {
    container.close();
}

Bom, espero que isso ajude ou você ou alguém que precise… =)

Criado 28 de julho de 2011
Ultima resposta 4 de nov. de 2011
Respostas 6
Participantes 3