Não é o melhor dos assuntos, mas é bastante interessante. Imagine a possibilidade de instanciar um objeto, dar valores às suas propriedades e gravá-lo em disco. Melhor ainda, pense na possibilidade de recuperar o objeto do disco e ter todas as propriedades com os valores que você definiu. Legal, não?

Esse mês estou fazendo um pequeno trabalho em Java usando um banco de dados orientado a objetos chamado db4o e resolvi compartilhar com o mundo um simples exemplo da sua aplicação.

Update (26/06/2008): a aplicação já estava pronta há um tempo, mas eu só pude disponibilizá-la hoje, neste post do blog.

Carro.java

/**
 * Definição básica de um Carro.
 *
 * @author Israel Júnior
 */

public class Carro {

    private String fabricante;
    private String modelo;

    public Carro(String marca, String modelo) {
        this.fabricante = marca;
        this.modelo = modelo;
    }

    public String getFabricante() {
        return fabricante;
    }

    public void setFabricante(String fabricante) {
        this.fabricante = fabricante;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    @Override
    public String toString() {
        return this.fabricante + " " + this.modelo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Carro other = (Carro) obj;
        if (this.fabricante != other.fabricante &&
                (this.fabricante == null ||
                !this.fabricante.equals(other.fabricante))) {
            return false;
        }
        if (this.modelo != other.modelo &&
                (this.modelo == null || !this.modelo.equals(other.modelo))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash =  23 * hash +
                (this.fabricante != null ? this.fabricante.hashCode() : 0);
        hash = 23 * hash + (this.modelo != null ? this.modelo.hashCode() : 0);
        return hash;
    }
}
 

App.java

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;

/**
 * Exemplo de utilização do db4o.
 *
 * @author Israel Junior
 */

public class App {

    private static final String DB_FILENAME = "exemplo.db";
    private static ObjectContainer db;

    public static void main(String args[]) {
        // Abrindo o arquivo de dados.
        db = Db4o.openFile(DB_FILENAME);
        try {
            // Instanciando dois objetos da classe Carro.
            Carro corsa = new Carro("Chevrolet", "Corsa Hatch 1.6");
            Carro fiesta = new Carro("Ford", "Fiesta Hatch 1.6");

            // Gravando os dois objetos no banco de dados.
            db.set(corsa);
            db.set(fiesta);
            db.commit();

            // Retornando os objetos gravados no banco usando o método de
            // Query by Example.
            ObjectSet resultado = db.get(Carro.class);
            System.out.println(resultado.size() + " carro(s) retornado(s):");
            while (resultado.hasNext()) {
                Carro carro = (Carro) resultado.next();
                System.out.println(" - (" + carro.hashCode() + ") " + carro);
            }
        } finally {
            // Fechando o arquivo de dados.
            db.close();
        }
    }
}
 

Executando o exemplo acima uma vez obtive a seguinte saída:

2 carro(s) retornado(s):
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6

Não satisfeito, executei o exemplo mais uma vez (sem apagar o arquivo do banco de dados):

4 carro(s) retornado(s):
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6

Fazer override nos métodos equals() e hashCode() me deu a possibilidade de criar um tipo de chave primária no banco (notem os hashCodes iguais na segunda listagem).

Neste exemplo usei o db4o em modo embutido, apesar de ele também funcionar em modo cliente-servidor. Até o momento estou gostando bastante da experiência de fazer persistência de objetos usando um banco de dados OO. Porém, como o modelo ainda é bastante imaturo (em relação ao modelo relacional) é bom mantê-lo somente no contexto acadêmico.

Veja também