Armazenando objetos relacionados

O armazenamento de objetos relacionados é bem simples, utilizando o método set() no objeto que seja top-level da relação para armazenar ambos. Para isso, vamos modificar a classe cliente, adicionando um relacionamento HAS-A Cliente -> Produto. Abaixo segue a classe alterada e a nova classe Produto.

Classe Cliente alterada:


            package br.com.javamagazine;

public class Cliente {

      private int codigo;

      private String nome;

      private Produto produto;
  

      public Cliente(int codigo, String nome) {

            super();

            this.codigo = codigo;

            this.nome = nome;

      }    

      public int getCodigo() {

            return codigo;

      }

      public void setCodigo(int codigo) {

            this.codigo = codigo;

      }

      public String getNome() {

            return nome;

      }

      public void setNome(String nome) {

            this.nome = nome;

      }
   

      public Produto getProduto() {

            return produto;

      }

      public void setProduto(Produto produto) {

            this.produto = produto;

      }
    

      public String toString(){

return "Codigo: "+ codigo + " Nome: " + nome + "\n" + "Produto: "+ produto.getNome();

      }      

}
        

Classe Produto


            package br.com.javamagazine;


public class Produto {

      private String nome;

      private Double valor;

     
      public Produto(String nome, Double valor) {

            super();

            this.nome = nome;

            this.valor = valor;

      } 

      public String getNome() {

            return nome;

      }

      public void setNome(String nome) {

            this.nome = nome;

      }

      public Double getValor() {

            return valor;

      }

      public void setValor(Double valor) {

            this.valor = valor;

      }

    
      public String toString (){

            return "Nome: " + nome + "Valor: " + valor;

      }
  

}
        

A seguir segue a aplicação do armazenamento de objetos relacionados:


            package br.com.javamagazine;

import com.db4o.Db4o;

import com.db4o.ObjectContainer;

import com.db4o.ObjectSet;

 
public class Main {

      public static void main(String[] args) {

            ObjectContainer db=Db4o.openFile("c:/guerra.yap");

            Cliente cliente = new Cliente(123,"José");

            Produto produto = new Produto("Celular",100.2);

            cliente.setProduto(produto);

            db.set(cliente);

            ObjectSet<Produto> set = db.get(Produto.class);

            while (set.hasNext()){

                  System.out.println (set.next());

            }

      }

}
        

Saída



Nome: CelularValor: 100.2

[db4o 5.5.1   2006-12-08 11:51:21]

 'c:/guerra.yap' closed by ShutdownHook.

        

O produto do cliente foi armazenado implicitamente no exemplo citado.

Recuperando Objetos relacionados

Agora faremos a busca do Cliente José e do produto relacionado a ele:


            package br.com.javamagazine;


import com.db4o.Db4o;

import com.db4o.ObjectContainer;

import com.db4o.ObjectSet;

import com.db4o.query.Query;

 
public class Main {

      public static void main(String[] args) {

            ObjectContainer db=Db4o.openFile("c:/guerra.yap");

            Query query = db.query();

            query.constrain(Cliente.class);

            query.descend("nome").constrain("José");

            Cliente cliente = (Cliente) query.execute().next();

            ObjectSet<Cliente>set = db.get(cliente);

           
            while (set.hasNext()){

                  System.out.println (set.next());

            }

      }

}
        

Saída


            Codigo: 123 Nome: José

            Produto: Pen Drive

            [db4o 5.5.1   2007-01-09 17:58:07]

            'c:/guerra.yap' closed by ShutdownHook.

        

Controle de Transações

O db4o oferece o suporte para o controle de transações, onde clientes acessam o banco de forma paralela a um mesmo banco de dados. Provavelmente você já deve ter trabalhado com os Commits e Rollbacks de algum banco relacional que suporte transações. O db4o trabalha de forma semelhante, como veremos a seguir.

Commit e Rollback

Por definição o db4o trabalha sempre com transações. Ao iniciar o container, o db4o inicia implicitamente uma transação. Ao fechar o container a transação é terminada e commit é executado também de forma implícita. Toda essa operação é feita de forma automática, mas nada impede que seja feita de forma manual:


            package br.com.javamagazine;
 

import com.db4o.Db4o;

import com.db4o.ObjectContainer;

import com.db4o.ObjectSet;


public class Main {

      public static void main(String[] args) {

            ObjectContainer db=Db4o.openFile("c:/guerra.yap");

            Produto produto = new Produto("Home Theater", 500.0);

            db.set(produto);

            db.commit();           

            ObjectSet<Cliente> set = db.get(Produto.class);

           

            while (set.hasNext()){

                  System.out.println (set.next());

            }

      }


}
        

Saída


            Nome: Teclado Valor: 20.0

Nome: Home Theater Valor: 500.0

Nome: Teclado Valor: 20.0

Nome: Pen Drive Valor: 150.0

Nome: Teclado Valor: 20.0

Nome: Celular Valor: 100.2

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Celular Valor: 100.2

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0

[db4o 5.5.1   2007-01-09 18:18:53]

 'c:/guerra.yap' closed by ShutdownHook.
        

Não há nenhuma diferença em efetuar o db.commit() porque este comando é executado automaticamente quando o container é fechado.

Porém, podemos voltar ao estado do banco dados a partir do ultimo commit efetuado utilizando o Rollback:


            package br.com.javamagazine;

 

import com.db4o.Db4o;

import com.db4o.ObjectContainer;

import com.db4o.ObjectSet;

 

public class Main {

      public static void main(String[] args) {

            ObjectContainer db=Db4o.openFile("c:/guerra.yap");

            Produto produto = new Produto("DVD", 300.0);

            db.set(produto);

            System.out.println("Exibindo dados antes do Rollback: \n");

            ObjectSet<Cliente≫ set = db.get(Produto.class);
           

            while (set.hasNext()){

                  System.out.println (set.next());

            }

            db.rollback();

            System.out.println("Exibindo dados depois do Rollback: \n");
        

            set = db.get(Produto.class);
           

            while (set.hasNext()){

                  System.out.println (set.next());

            }

           
      }

}
        

Saída:

Exibindo dados antes do Rollback:


            Nome: Teclado Valor: 20.0

Nome: Home Theater Valor: 500.0

Nome: Teclado Valor: 20.0

Nome: Pen Drive Valor: 150.0

Nome: Teclado Valor: 20.0

Nome: DVD Valor: 300.0

Nome: Celular Valor: 100.2

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Celular Valor: 100.2

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0
        

Exibindo dados depois do Rollback:


            Nome: Teclado Valor: 20.0

Nome: Home Theater Valor: 500.0

Nome: Teclado Valor: 20.0

Nome: Pen Drive Valor: 150.0

Nome: Teclado Valor: 20.0

Nome: Celular Valor: 100.2

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Pen Drive Valor: 150.0

Nome: Celular Valor: 100.2

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0

Nome: Palm Valor: 500.0

[db4o 5.5.1   2007-01-10 11:02:43]

 'c:/guerra.yap' closed by ShutdownHook.
        

Podemos perceber que o banco voltou ao seu estado original a partir do ultimo commit executado. O Produto DVD foi armazenado no cache, mas não foi “comitado”, já que executamos o Rollback.

No próximo artigo falaremos sobre o ambiente Cliente / Servidor, com exemplos de aplicações Embedded e Networking, Id’s, Encriptação, Tunning, Manutenção e o Object Manager.

Links: