advertisement
javaboutique
Search Tips
Articles  |   Tutorials  |   Reviews  |   Tools  |   by Category  |   by Date  |   by Name  |   Submit  |   Source  |   Forums  |  
javaboutique
Browse DevX


Partners & Affiliates











advertisement


Reviews :

Mapping Java Objects to a Database with Castor-JDO:

The Source of Magic

I was curious about what was going on behind the scenes. How many SQL SELECTs were being issued? One way to find out is to turn on logging. You do this simply by adding these statements in the top of your program:

import org.exolab.castor.util.Logger;
import java.io.*;
. . .
PrintWriter writer = new Logger(System.out).setPrefix("test");      
jdo.setLogWriter(writer);

If we run the program once more we'll see this:

[test] SQL for creating hansen.playground.Movie: INSERT INTO movie ...
(more lines cut out here)
[test] SELECT actor.id,actor.name,actor_movie.id_movie FROM actor 
       LEFT OUTER JOIN actor_movie 
       ON actor.id=actor_movie.id_actor WHERE (actor.name = ?)
[test] Castor: Loading hansen.playground.Actor (23)
[test] Castor: Loading hansen.playground.Movie (12)
[test] Castor: Loading hansen.playground.Media (1)
[test] Castor: Loading hansen.playground.Actor (22)
[test] Castor: Loading hansen.playground.Movie (11)
[test] Castor: Loading hansen.playground.Media (2)
[test] Castor: Loading hansen.playground.Movie (13)
[test] Castor: Loading hansen.playground.Actor (21)

The first lines that are listed are all the SQL statements that Castor will use when reading,  creating, updating, and deleting objects from the tables. I've only shown part of the first create statement above. Following this is the (first) SELECT statement that is the result of the query for Keanu Reeves. Finally there's a line each time an object is created. The keys are listed in parenthesis. Here's a "translation":

[test] Castor: Loading hansen.playground.Actor (Ian Holm)
[test] Castor: Loading hansen.playground.Movie (Lord of the Rings)
[test] Castor: Loading hansen.playground.Media (DVD)
[test] Castor: Loading hansen.playground.Actor (Laurence Fishburne)
[test] Castor: Loading hansen.playground.Movie (The Matrix)
[test] Castor: Loading hansen.playground.Media (VHS)
[test] Castor: Loading hansen.playground.Movie (Chain Reaction)
[test] Castor: Loading hansen.playground.Actor (Keanu Reeves)

The lines seems to come in opposite order, but this might simply reflect the way Castor is coded, e.g. by using recursive methods. You might also wonder why all objects are loaded, even the movie where Keanu Reeves doesn't act. The reason is that if you use the DVD object to get all movies in DVD format then you'll need "Lord of the Rings". And when you get this movie you'll also need Ian Holm. And so on.

Getting more information

If you're familiar with SQL then you'll see that one SELECT is not enough to get all the objects we need. Let's therefore use a tool like P6Spy. It's a utility that sits between a JDBC program and the database and watches and reports on the "traffic". To use it you replace the name of the JDBC driver in Castor's database.xml file with the P6Spy driver, and tell P6Spy to use the real JDBC driver. I won't go into details about installation of P6Spy. Suffice to say, it's very simple to do.

What P6Spy tells you (in its spy.log file) when you run the ReadActor program is this:

SELECT actor.id,actor.name,actor_movie.id_movie 
       FROM actor 
       LEFT OUTER JOIN actor_movie ON actor.id=actor_movie.id_actor 
       WHERE (actor.name = 'Keanu Reeves')
SELECT movie.title,movie.id_media,actor_movie.id_actor 
       FROM movie 
       LEFT OUTER JOIN actor_movie ON movie.id=actor_movie.id_movie 
       WHERE movie.id='11'
SELECT media.type,movie.id 
       FROM media 
       LEFT OUTER JOIN movie ON media.id=movie.id_media 
       WHERE media.id='1'
(5 more follows)
commit

The first select is the same as we've seen before. The others are used to get data for all the objects in the model (3 actors, 3 films, 2 medias).

This brings up a question about performance. What if you don't have a need for all the objects? Couldn't we postpone loading of objects until they're actually needed? The answer is yes, there's a mechanism called "lazy loading", which is one of the topics we'll look into in my next article. So stay tuned on JavaBoutique.com!  

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.

XML error: undefined entity at line 19
advertisement
Receive Articles via our XML/RSS feed
Receive Articles via our XML/RSS feed

JavaBytes
Internet Cyclone
This powerful, easy-to-use, internet optimizer is for Windows 95, 98, ME, NT, 2000 and XP. It's designed to automatically optimize your Windows settings, boosting your Internet connection up to 200%.

Linux Vendors Head to the Cloud in Search of Cash
iPhone 3GS: Overheating Fears, OS Update Nears
PostgreSQL 8.4 Revs Up Database Admin, Security
PHP 5.3 Accelerates PHP
Sun Releases NetBeans 6.7 IDE for Java, PHP
Why Firefox Doesn't Take Google Chrome Features
First Major PHP Update in Years Coming Soon
Red Hat CEO Calls on Oracle to Keep Java Open
Google Widens AdSense for iPhone, Android Apps
Eclipse Galileo Releases 33 Open Source Projects

A Taste of JavaFX for the Uninitiated
A Guide to Caching and Compression for High Performance Web Applications
How User-Centered Design Can Put User Stories in Proper Context
Explore C# 4's New Dynamic Types and Named/Optional Parameters
Enterprise Architecture: The Journey Begins Here, Part 2
Create a Syslog Sender/Receiver Using the MS Winsock Control
AMD CodeAnalyst Helps Developers Optimize and Tune Applications
Securing Microsoft's Cloud Infrastructure
Introducing the Azure Services Platform
An Introduction to Microsoft .NET Services for Developers

Advertising Info  |   Member Services  |   Contact Us  |   Help  |   Feedback  |   Site Map  |   Network Map  |   About

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Reprints, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs