Advertisment

db4o: Making Object Persistence Easy

author-image
PCQ Bureau
New Update

With most Java applications, developers have to deal with issues related to

data persistence, mainly because of interfacing with a relational database. But

as the application is based on an Object model and the database on a Relational

model, an Object-Relational Impedance mismatch arises, with both systems taking

a different view of how entities interact with each other. Objects have an

implicit sense of identity denoted by references to memory location, while

Relations have an explicit sense of identity denoted by the primary key of the

table relationship attribute. This creates a gap between the operation of

Objects and Relations. And it's for developers to bridge this gap.

Advertisment

Bridging the gap



The easiest way to bridge this gap is through manual mapping, ie writing SQL

queries using JDBC and retrieving results into variables. Manual mapping has

always been a tedious task, and was made easier with automated

object-relational-mapping tools or libraries like Hibernate or JDO. With these

libraries or tools, objects are mapped to tables in relational DBMSes through

the underlying framework that generates required SQLs for storing and retrieving

object attributes. And even though these tools have minimized developers' tasks

by auto-generating the necessary SQL queries, the mapping problems haven't gone

away; in fact they've just moved over to configuration files (usually in XML

format). When an application has a complex object model, it becomes more

difficult to perform this mapping. Inheritance and many-to-many relationships

are few such complexities that can't be directly represented in the relational

model. Mapping of an inheritance model results in the creation of a set of

tables which results in a conflict of weighing query performance versus the

violation of normalization rules for the database. A solution for this would be

to create a database that uses an object model for storage.

Direct Hit!

Applies To:

Adv Java developers



USP: Lightweight object oriented database
suitable for embedded apps



Primary Link:
www.db4o.com/  community



Keywords: db4o, object oriented DBMS

db4o: Object database



The db4o (Database for Objects) is one of the few Open Source Object

Oriented DBMSes that gives a new life to the concept of 'pure object storage'

for object developers (based on Java or .NET platforms). With object databases,

objects are stored as objects and thus avoid the impedance mismatch between

applications and database models. With OODBMS, objects are stored in such a

manner that they retain their nature throughout their lifetime; they are either

in application or in a database domain. The object's content, structure and

relationships are preserved, regardless of class complexities. OODBMS fits

ideally into applications where the overhead of RDBMS is unnecessary, and a

small-footprint database can suffice the need for the application. The benefits

of using an object database like db4o include easier code maintenance and the

ability to create new applications that have complex data models. db4o database

engine allows storage of dynamic, free-form data that can be modified any time,

unlike an RDBMS where tables are predefined and rigid. Thus, data persistence

can easily be achieved using a db4o database engine. Due to this, db4o has found

usage varying from PDA-based applications to flight navigation systems in

aircrafts. Developers can directly work with persistent data without worrying

about relationship mapping with the database. db4o is available for Java, .NET

and Mono platforms. Another feature of db4o is that the database created by a

Java application can be easily accessed using a .NET application and vice versa.

Advertisment

Getting started



Download the latest 6.4 version of db4o from the link provided in the box.

This version provides support up to JDK5. You just need to extract the contents

of the archived file to the local disk before you can start using the

db4odatabase. The directory db4o-6.4/lib contains few db4o-6.4xx-javaX.jar

files, where javaX refers to the JDK version you want to use. In our case, it

happens to be JDK5; so for installation we will use the db4o-6.4xx-java5.jar

file. To install, we just need to add the path of the db4o-*.jar file to the

system environment's CLASSPATH entry. If you are using a development environment

such as Eclipse, you can add the db4o-*.jar file to the project's /lib/ folder.

Since db4o runs in the same process space as the application, it gets called

directly without employing any JDBC drivers.

Demo application



Once the db4o-6.4-*.jar has been added to the system's classpath or to the

application's projects /lib/ folder, we can start working on an application. To

demonstrate the working for the db4o database engine, let's just create a

Contact class having attributes such as name, number and email. The following

code snippet shows the Contact class:

public class Contact



{


private String name;


private String email;


private String number;


public Contact()


{ }


public Contact(String name, String number, String email)


{






Advertisment





this.name = name;


this.number = number;


this.email = email;


}


public String getName() { return name; }


public void setName(String value) { name = value; }


public String getNumber() { return number; }


public void setNumber(String value) { number = value; }


public String getEmail() { return email;}


public void setEmail(String value) {


email = value; }


public String toString()


{


return


"

"Name = " + name + " \t" +


"Number = " + number + " \t" +


"E-Mail = " + email +


">";


}


}






















To get an instance of the Contact class into the database for a relational
model, you would need to create a schema describing the data type to the

database and also have to map the columns and tables of the database with the

fields of the Contact class. But in case of an object database, all this is not

required; one just has to work with the object model of the application. The

following code snippet shows how to generate the database based on the Contacts

instance:

import com.db4o.*;



public class Db4Demo


{


public static void main(String<> args)


throws Exception


{


ObjectContainer db = null;


try


{


db = Db4o.openFile("Contacts.yap");


Contact c1 = new Contact("Andrews", "9933211450", "andrew@gmail.com");


Contact c2 = new Contact("Kylie", "9350102010", "kylie@yahoo.com");


db.set(c1);


db.set(c2);


db.commit();


ObjectSet result = db.get(new Contact(null, null, null));


while (result.hasNext())


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


}




















finally


{


if (db != null) db.close();


}


}}



Advertisment

In the above code snippet, db refers to an ObjectContainer that is used to

open the new database. A db4o database is a single file with a .yap extension,

and its set() method is used to store objects. In the above code, we are adding

two object instances, c1 and c2, of the Contact class to the database in file

Contacts.yap. To retrieve what is stored in the database, we use the get()

method of the ObjectContainer; the result is retrieved as an ObjectSet.

Moreover, in the code, if you look at:

ObjectSet result = db.get(new Contact(null, null,

null));

You would notice that we are passing parameters as null, and so would be able

to retrieve all entries from the database.

Advertisment

Similarly, if we want to update a record (for eg, change the email for a

Contact named Andrews), the simplest way would be through the use of QBE (Query

By Example), which is similar to the SELECT query of the SQL statement.

ObjectSet update = db.get(new Contact("Andrews", null,

null));



Contact c = (Contact) update.next();


c.setEmail("andrew@aol.com");


db.set(c);

In the get() method we will pass the string Andrews for the name parameter

and the matching result will be stored in the ObjectSet update. On calling

Contact's setEmail() method, we can change or update the email entry in the

database. db4o is easy to use for applications that require a low foot-print

embedded database and where the object model of the application does not require

a database that needs manual intervention (which is otherwise possible with

relational databases like Oracle or MySql). More importantly, as the overhead on

the application is reduced (since the developer doesn't have to code for

relational mappings), db4o becomes an ideal choice for developers for small and

embedded applications.

Advertisment