DB4Objects – Parte III

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

O armazenamento de objetos relacionados é bem simples, utilizando o método set() no objeto que seja top-level da relação para armazenar ambos...

 

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. Até lá!

Leia também

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?