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.