Whats new? | Login | Parceiros
Cadastre-se | Atendimento | RSS
+ Java:
artigos   |   vídeos   |    cursos   |    mais

DB4Objects – Parte III

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

GLAUCIO GUERRA
Há cinco anos atuando com desenvolvimento de software, Glaucio Guerra (glaucioguerra@gmail.com) trabalha como Analista de Sistemas no ambiente Petrobras, no Rio de Janeiro, sendo bacharelando em Ciência da Computação. Atualmente, concentra seus proje...


Ver space do autor


Estatísticas:
Visualizações:
11424
Favoritado:
 7 vez(es)

Serviços:



DB4Objects – Parte III

 

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á!





Participe! Inclua um comentário
[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Juliano
25/1/2007 19:02
Parabéns Nunca vi em lugar nenhum um artigo tão didático sobre Banco de Dados OO, não sei se o mérito é seu ou do DB4Objects que me parece sensácional! :) Obs. Achei que você ia buscar pelo nome do produto no ex. da pesquisa do obj. relacionado ao cliente. Como se faz isso? Outra dúvida, SQL nem pensar? Bom... Aguardo as próximas partes!

[responder]

 
Glaucio Guerra
5/2/2007 08:53
RE:   Olá Juliano, obrigado por sua opinião. Com relação a sua dúvida, essa busca seria bi-direcional, então você precisaria fazer com que o produto também tenha um relacionamento com o Cliente. Me mande um e-mail para eu criar um exemplo para você ok? Um abraço!

[responder]
 



 


[Fechar]
Este post está disponível para assinantes da Java Magazine, SQL Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
DevMedia Group   www.devmedia.com.br   |   www.javafree.org   |   www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038