Feature
Evaluating Options for Persisting Java Objects
Hibernate, DB4O, and Caché Database with Jalapeño
Jun. 2, 2007 05:15 PM
Note:
For any non-trivial object schema you'll have to add annotations to
support database specific functionality - such as relationships and
indices. Annotating your Java Classes for Jalapeño works like the way
it works for Hibernate. InterSystems is releasing NetBeans, Eclipse,
and IntelliJ plug-ins for Caché 2007 that makes the process of adding
annotations a point-and-click operation. Thus you can quickly define or
modify the Object Storage in the Caché database.
An example of how a relationship is defined:
// In the Department class
@Relationship(type=RelationshipType.ONE_TO_MANY,inverseClass="Person")
public ArrayList<Person> getEmployees(); // Method to return all employees
// In the Person class
@Relationship(type=RelationshipType.MANY_TO_ONE,inverseClass="Department")
public Department getDepartment(); // Method to return the department
Ease of Persisting Objects
Once you have your
databases created and configured, persisting your objects with any of
these methods is very simple. Any of these is a distinct improvement
over using JDBC/SQL and DAOs.
Hibernate
Once your Hibernate mappings are configured, persisting an object is very straightforward:
try{
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); //optional
Person person = new Person("James","Hogan");
Long personID = (Long) session.save(person);
tx.commit();
session.close(); //optional
}catch(Exception e) {
}
DB4O
Once again, DB4O makes it extremely easy to persist your objects. Simply instantiate an object and then call db.set() on it.
ObjectContainer db=Db4o.openFile("C:\db4o\test.yapp");
try {
Person person = new Person("James","Hogan");
db.set(person); // It's now saved!
// commit is called implicitly when you close the container,
// so you don't really need to call it here.
db.commit(); //optional
}finally {
db.close();
}
Caché
Caché also makes it extremely simple to save your objects.
try {
/* Connect to this machine, in the SAMPLES namespace */
ObjectManager objectManager = connect (connectiontype, host, username,
password);
Person person = new Person("James","Hogan");
Object id = objectManager.save (person, false);
objectManager.close ();
} catch (Exception ex) {
}
Ease of Retrieving Objects
Storing data is only
half the equation. It must be easy to access your objects as well. Once
again all three solutions simplify the process of getting an object.
Hibernate
You can use HQL or SQL to retrieve objects using Hibernate. For example:
package hello;
import java.util.*;
import org.hibernate.*;
import persistence.*;
public class HibernateExample {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = session.beginTransaction();
List people = newSession.createQuery("from Person m order by?m.name asc").list();
System.out.println( people.size() + " people found:" );
for ( Iterator iter = people.iterator();
iter.hasNext(); ) {
Person person = (Person) iter.next();
System.out.println( person.getName() );
}
newTransaction.commit();
newSession.close();
// Shutting down the application
HibernateUtil.shutdown();
}
}
About Richard ConwayRichard Conway is a software developer and technology consultant with more than 15 years of technology, project management, and information services experience. He has extensive experience developing Java/Struts-based web applications. He started focusing more on Swing based developments at the beginning of 2005 and has just finished a Swing-based client/server asset management project. He lives in Miami with his wife Patricia, is currently working on an EMR application, and plays sand volleyball in his spare time.