Db4o: dúvidas "relacionais" em busca de respostas "OO" [RESOLVIDO]

Boa galera,
Estou com dúvidas “relacionais” em busca de respostas “OO” no uso do Db4o:

1 - Adicionar restrição para não excluir um objeto associado à outro objeto? Ex.: objVenda e objVendaItem.

2 - Adicionar restrição para que o valor do atributo seja único, isto é, que o valor do atributo não seja encontrado em mais de um objeto? Ex.: Atributo CPF na classe cliente.

3 - Como garantir que o objeto seja único, isto é, chave primária?

A um ano atrás fiz um trabalho pra faculdade usando o DB4o, e para as suas perguntas minhas respostas. Não quer dizer que seja as unicas opções, na época foi a unica que eu tinha encontrado, talvez alguma coisa tenha mudado de lá pra cá, eu não cheguei a utilizado recentemente.

1 - Fazer na mão, antes de excluir uma venda, excluir primeiro o item da venda.

2 - Fazer na mão, antes de incluir um registro, primeiro verifica se já não existe uma pessoa com esse cpf, caso tenha atualiza, ou lança uma exceção, senão insere.

3 - Por debaixo dos panos o DB4o cria um id (UUID) pra vc, mais ele não é exposto, quando eu fiz o trabalho eu não precisava de um id sequencial (1,2,3, …) para cada classe(tabela), então eu usei a classe java.util.UUID que gera um id unico (String) para cada objeto persistido, é o mesmo que o DB4o faz, a diferença que ele não expõe esse id gerado.

Espero ter ajudado.

Olá davisnog,

Muito obrigado pela colaboração.

Para uma breve resposta encontrei um exemplo que configura o atributo de uma classe como UNIQUE. Quando tentar inserir um objeto diferente que tem um valor igual para um atributo UNIQUE será lançada uma exception.

As responsáveis por isso são:

UniqueFieldValueConstraint;
UniqueFieldValueConstraintViolationException;

Veja o exemplo abaixo que pode ser encontrado em

http://developer.db4o.com/Projects/useful_snippets/unique_constraint_on_field_example.html


package br.dgc;

import java.io.File;

import com.db4o.Db4o;
import com.db4o.config.*; // Coloquei esta linha pq sem ela estava dando problema. ;)
import com.db4o.ObjectContainer;
import com.db4o.constraints.UniqueFieldValueConstraint;
import com.db4o.constraints.UniqueFieldValueConstraintViolationException;

public class TestMain {
    static class Item {
        public String id;

        @Override
        public String toString() {
            return "Item:" + id;
        }
    }

    public static void main(String[] args) {
        //File f = new File("test.yap");
        //f.delete();

  Configuration config = Db4o.newConfiguration();
  config.objectClass(Item.class).objectField("id").indexed(true);
  config.add(new UniqueFieldValueConstraint(Item.class, "id"));
  ObjectContainer db = Db4o.openFile(config, "test.yap");

        Item item = new Item();
        item.id = "123";
        db.set(item);
        try {
            db.commit();
            System.out.println(item);
        } catch (UniqueFieldValueConstraintViolationException exc) {
            db.rollback();
            System.out.println("ERROR: " + item);
        }
        Item item1 = new Item();
        item1.id = "123";
        db.set(item1);
        try {
            db.commit();
            System.out.println(item1);
        } catch (UniqueFieldValueConstraintViolationException exc) {
            db.rollback();
            System.out.println("ERROR: " + item);
        }
        System.out.println(db.query(Item.class));
        db.close();
    }
}

Acho que isto ajuda a resolver a 2ª e a 3ª dúvida.

Opa, melhor ainda se já tem algo pronto.
:lol:

Na versão 8 não existe o método set para ObjectContainer, então troquei pore store() e ele parece não estar funcionando.
Vou voltar a versão 7 para testar com o UniqueFieldValueConstraint.

O problema não é a versão e sim quando existe uma classe pai, onde a pai é que vai dá origem a propriedade que se tornará index.
A solução então foi colocar o indice na classe filha para que o DB4O passe a aceitar então o indice.