Db4Objects e Coleções

Olá… Sou começando substitui a dupla hibernate/mysql por db4objects em um pequeno projeto para um Estudio de Fotografias. Não sou um usuário muito experiente em Java, por isto, minhas camadas de aplicação por vezes são um pouco confusas, mas bem, deixe-lhes explicar como está estruturada.

Criei uma aplicação servidora que nada mais é do que a linha abaixo iniciada em um JFrame que fica aberta até que se feche este JFrame.

ObjectContainer db = Db4o.openClient("localhost", 1357, "root", "pbos");

Minha classe Pedido estava assim:

public class Pedido {
    private Integer id;
    private Date data;
    private  Set<Pagamento> pagamentos = new HashSet();
    public Set<Pagamento> getPagamentos() {
        return this.pagamentos;
    }
...
}

E minha classe Pagamento assim:

public class Pagamento {
    private Integer id;
    private Date data;
    private double valor;
}

Estava com problemas para retornar os pagamentos de um pedido com a instrução:

Collection<Pagamento> pagamentos = pedido.getPagamentos(); 

Foi então que alterei a classe Pedido, retirando a referência à coleção de pagamentos:

public class Pedido {
    private Integer id;
    private Date data;
...
}

E passei a retornar os pagamentos a partir de S.O.D.A

Query query = db.query(){
query.constrain(Pagamento.class);
query.descend("pedido", pedido);
List<Pagamento> pagamentos = query.execute(); 

Passei a alterar todo o meu projeto e retirar as referências à coleções das classes e utilizar S.O.D.A para retorná-las.

Existe uma forma de fazer funcionar o db4objects para coleções, sem precisar utilizar S.O.D.A ou Native Query?

Também estou tendo dificuldade para “filtrar” datas como o select * from Pedido where pedido.data >= dataInicial and pedido.data <=dataFinal, com as instruções

query.descend("data").constrain(dataInicial).greater().equal().or(query.descend("data").constrain(dataFinal).smaller().equal())

Por fim, algo estranho aconteceu… Apaguei o arquivo da base de dados, reinicie o servidor, inicie a aplicação, inseri alguns dados em Cliente, Produto, Pedido, mas pagamentos e itens de pedidos não foram retornados nem por S.O.D.A, estava a ponto de desistir de usar até o db4objects, foi então que fechei a aplicação, parei o servidor e iniciei-o novamente e abri novamente a aplicação, então os itens de pedidos e pagamentos puderam ser retornados por S.O.D.A logo de suas inclusões com:

db.set(pagamento);
db.commit();

Tenho usado Netbeans 5.5, Java 1.6 e Db4Objects 6.1.

Ah! eu chamo [db = Db4o.openClient(“localhost”, 1357, “root”, “pbos”);] somente quando inicio a aplicação e nunca fecho, só quando saio dela. Está correto esta forma?

Obrigado a todos e desculpem o volume de questionamentos.

Complementando dúvidas hehehe

Nem todas as alterações com commit são percebidas pela aplicação iniciada em outras máquinas. As vezes sim, as vezes não… o que pode ser?
Valeu gente

Alguma “pendengas” foram resolvidas, postei aqui minhas soluções:
http://developer.db4o.com/forums/thread/33543.aspx

O problema agora é quanto alterações de instâncias já persistentes, pois estas alterações não são divulgadas ou percebidas pela aplicação rodando em outras máquinas, novamente problema de cache.

Valeu!

Bom, pra resolver esta minha última “pendenga” estou utilizando o seguinte método:

    public static void refresh(List objects) {
        for (Object object: objects) {
            getDb().ext().refresh(object, 2);
        }
    }

Então após cada query.execute(), passo esta lista como parâmetro para este método, não sei até que ponto isto vai impactar em minha performance, mas está funcionando por enquanto.

Fica o registro para todos aqueles que por ventura venham a passar por este problema.

Abraço a todos.

Olá a todos!

Só pra deixar registrado. A dificuldade que eu tinha para fazer exclusão em cascata a partir de um objeto pai, foi sanada com a configuração do Db4o com a seguinte instrução:

// Esta instrução eu já tinha
Db4O().configure().objectClass(Pedido.class).cascadeOnDelete(true);

// Faltava esta instrução
Db4O().configure().objectClass(Pedido.class).objectField("materiais").cascadeOnDelete(true);

Obrigado a todos: aos que divulgaram o db4o e permitiram que eu o conhecesse e aos que de uma direta ou indiretamente me auxiliaram neste fórum e em outros.

Adeus hibernate! :smiley:

Abraços

Então flaviomreis to tentando dar um tchau ao hibenate tambem ao utilizar o db4o mas estou com difilcudade pra pegar o ultimo id gerado para a classe. alguém ai ou vc mesmo sabe como posso resolver isso.

Obrigado.