Che-Rung Lee`s talk on JDO

Download Report

Transcript Che-Rung Lee`s talk on JDO

Java Data Object
Che-Rung Lee
JDO Objectives
Transparent persistence
Range of implementations
embedded (J2ME)
two tier (J2SE)
enterprise (J2EE, EJB)
Datastore independence
relational, object, hierarchical databases
XML DB, file systems
What’s the difference?
Serialization
no database capabilities (transactions, queries)
JDBC
cannot storing Java object models.
incompatibilities among SQL implementations
can result in a loss of application portability
CMP (Container Managed Persistence)
a distributed model of computation, imposing
performance degradations
JDO Introduction
JDO API
An example
Datastore mapping
JDO implementation
JDO API
 Two classes
 I18NHelper
 JDOHelper
JDOHelper
I18NHelper
 Six interfaces
1.
2.
3.
4.
5.
6.
PersistenceManagerFactory
PersistenceManager
Instance
Transaction
Callbacks
Extent
Query
InstanceCallbacks Transaction
Persistence
Manager
Factory
Persistence
Manager
Query
Extent
1. PersistenceManagerFactory
Create PersistenceManager
May implement PersistenceManager
pooling, connection pooling among
PersistenceManagers
I18NHelper
JDOHelper
Persistence
Manager
Factory
Datastore configuration
Supports JNDI
Instance
Callbacks
Transaction
Persistence
Manager
Query
Extent
2. PersistenceManager
Primary application interface
PersistenceCapable instance management
identity
life cycle
Transaction factory
Query factory
JDOHelper
I18NHelper
Persistence
Manager Factory
Instance
Callbacks
Persistence
Manager
Extent factory
Transaction
Query
Extent
3. Transactions
One-one relation to Persistence Manager
Transaction interface for local transactions
isActive, begin,
commit, rollback
Persistence
Manager Factory
Provide ACID transaction
Atomic, Consistent,
Isolated, Durable
JDOHelper
I18NHelper
Instance
Callbacks
Transaction
Persistence
Manager
Query
Extent
4. Extents
Defined for PersistenceCapable classes
pm.getExtent (Class pc, boolean subclasses);
Used in Query and
class navigation
JDOHelper
I18NHelper
Persistence
Manager Factory
Instance
Callbacks
Transaction
Persistence
Manager
Query
Extent
5. Query
Can do filtering and ordering
Outer/inner join
Has JDOQL
JDOHelper
I18NHelper
Persistence
Manager Factory
Instance
Callbacks
Transaction
Persistence
Manager
Query
Extent
6. InstanceCallbacks
Event trigger functions in DBMS
PersistenceCapable class that provides
callback methods implements this interface
JDOHelper
I18NHelper
Methods
jdoPostLoad(),
jdoPreStore(),
jdoPreClear(),
jdoPreDelete()
Persistence
Manager Factory
Instance
Callbacks
Transaction
Persistence
Manager
Query
Extent
How to use JDO
 Write persistent object (Persistence Capable)
1. Write normal java objects
2. Specify their relation in a XML file
3. Enhance classes for persistence
 Make transactions (Persistence Aware)
 Create and connect to a datastore
 Insert / update / delete
 Query
Write PersistenceCapable objects
.java
Java
Compiler
.class
Byte code enhancement
JDO
Enhancer
.class
JDO MetaData
(XML)
Address book example
Persistent Object Model
Many to many relation
Person
*
*
Category
Classes to Persist
 public class Person {
Vector category; // element is Category
…
public Person() {}
}
 public class Category {
Vector person; // element is Person
…
private Category() {}
}
JDO MetaData
<?xml version=“1.0” encoding=UTF-8?>
<!doctype jdo public http://java.sun.com/dtd/jdo_1_0.dtd>
<jdo>
<package name=“addressBook”>
<class name = “Person”>
<field name= category>
<collection element-type = “Category”>
</field>
</class>
<class name = “Category”>
<field name= person>
<collection element-type = “Person”>
</field>
</class>
</package>
</jdo>
JDO Enhancer
Enhance classes to implement the
interface PersistenceCapable
run Enhancer with JDO metadata (.xml file)
and class files
$enhancer$ addressbook.jdo Person.class
Category.class
JDO Runtime Environment
JVM
Application
transient
transient
transient
PersistenceManager
PersistenceCapable
Extent
Query
PersistenceCapable
Transaction
PersistenceCapable
Access PersistenceCapable objects
 Code template
1. PersistenceManagerFactory pmf = JDOHelper.
getPersistenceManagerFactory(properties);
2. PersistenceManager pm =
pmf.getPersistenceManager();
3. Transaction tx = pm.currentTransaction();
4. tx.begin();
5. execute(); // transaction code
6. tx.commit();
7. pm.close();
Create a Datastore
JDO will create database, tables, indexes
Set property ConnectCreate = true
Unset this property if not creating a datastore
Do nothing on code
void execute() {}
Create persistence object
void execute(){
Person p = new Person(…);
pm.makePersistent(p);
// pm is a PersistenceManager
}
Update persistence object
We need get persistent objects from
datastore for update and delete
Assume we already got the object (Person
p) from datastore. For update, it’s simple
void execute(){
p.setName (newName);
}
Delete persistence object
Assume we get the object (Person p) from
datastore, and we want to delete it
void execute(){
Vector cat = p.getCategory();
for ( i=0;i<cat.size(); i++) {
Category c = (Category)cat.elementAt(i);
c.getPerson().remove (p);
}
pm.deletePersistent(p);
}
Get objects from datastore
Navigation
Query
From PersistenceManager
Object getObjectById(Object oid)
Object getTransactionalInstance(Object pco)
Navigate whole class
 void execute(){
Extent ext = pm.getExtent(Person.class);
Iterator itor = ext.iterator();
while (itor.hasNext()) {
Person p = (Person) itor.next();
}
}
Query with Filters
 void execute(){
Query qry = pm.newQuery(Person.class);
qry.setFilter(filters); // filter is a String
qry.setOrdering(“name ascending; birth
descending”);
Collection result = (Collection) qry.execute();
for(Iterator i = result.iterator();i.hasNext();)
Person p = (Person) i.next();
}
Query examples
Find the person named “Roger”
qry.setFilter (“name == \”Roger\”“);
Find the person by parameter (String who)
qry.declareParameters (“String who");
qry.setFilter (“name == who");
result = qry.execute (who)
JDO Query Language
JDO defines a set of functions for querying
isEmpty(): null singleton or collection or empty
collection.
contains(): collection
startsWith(), endWith(): String matching
Find persons in “CS*” Category
qry.declareParameters (“Category cat");
qry.setFilter(“category.contains(cat) &&
cat.name.startWith(\”CS\”)”);
Inside JDO
PersistenceCapable
Object identity
Object life cycle
Data mapping
Inheritance
Collection
Other issues
Primary key of PersistenceCapable
In datastore
assigned by the datastore and is not based on
field values in the object
In application
uses values of object state to form a unique
identity
Nondurable
not uniquely identifiable
How to compare o1 and o2?
Java identity
implemented by JVM
o1 == o2
Object equality
implemented by class developer
o1.equals (o2)
JDO identity
implemented by JDO vendor
o1.jdoGetObjectId().equals(o2.jdoGetObjectId())
Life Cycle of PersistenceCapable
Life Cycle States (1)
Persistent-new.
During the current transaction, the instance has
been placed under the control of JDO and a
JDO identity has been assigned.
Persistent-clean.
The instance’s fields have been read but not
modified in the current transaction.
Persistent-dirty.
The instance’s fields have been modified in the
current transaction.
Life Cycle States (2)
Hollow.
Only the JDO identity is loaded. Non-key fields
are reread from the datastore in subsequent
transactions.
Provides uniqueness of persistent instances
across transactions.
Hollow objects are subject to garbage collection
if the application does not hold strong
references to them.
Persistent-clean, persistent-dirty and persistentnew instances all become hollow after commit.
Life Cycle States (3)
Persistent-deleted.
Deleted in the current transaction. Access to
non-key fields will throw a JDOUserException.
Persistent-new-deleted.
Made persistent-new and then deleted in the
current transaction.
Transient, Transient-clean, Transient-dirty
The instance has not been placed under the
control of JDO.
Data Mapping
Issues
Database normalization: multi-table per class…
Performance: number of joins, update…
Field mapping: data types, read only…
Relation: delete policy…
Implementation dependence
Some implementations can configure data
mapping in JDO meta file
Data Mapping
Inheritance
Map all hierarchy to base class
Discriminator is required
Collection
Collection objects are second order object
Not have a JDO identity
Its owner can aware of its change
Difference among Set, List and Map
Other issues
Object instantiation during query execution
Invocation of object methods
Persistence by reachability
Garbage collector in database
JDOQL to SQL compilation
Allowing SQL in JDOQL
Cache management
Search caches for uncommitted objects
More …
Some JDO Implementations
Free
Sun Reference Implementation
Object Relational Bridge (OJB)
Commercial
Fast Objects
Frontier Suit for JDO (Object Frontier)
JDO Genie
LIBeLIS LiDO
SolarMetric Kodo JDO
Next version ?
Managed relationship support
Inter-PersistenceManager references
JDOQL to support projections
API for specification of pre-read policy
Enhancer invocation API
Read-only fields
Generation of sequence numbers for fields.
Aggregation functions for JDOQL
Summery
References
 http://access1.sun.com/jdo/
 http://www.JDOcentral.com/index.html
 http://www.oreilly.com/catalog/jvadtaobj/chapter/
ch01.pdf
 http://www.cognitivemachines.com/JDOchat.html
 http://java.sun.com/products/jdo/
 http://db.apache.org/ojb/
 http://servlet.java.sun.com/javaone/javaone2000