apache persistence layers
DESCRIPTION
TRANSCRIPT
The O/R impedance mismatch
Objects (Java Knowledge) RDBMS
firstName: Stringname: Stringmember: Boolean
People
type: Integerinfo: String
Contact
0..n
1
?
In a nutshell…
“Object-Relational mapping (O/RM),
is a programming technique that links
databases to object-oriented language
concepts, creating (in effect) a ‘virtual
object database’.”
– Wikipedia
Selection criterias
• Data access (CRUD)
• Developers knowledge
• Database languages (SQL, DDL)
Can we stop here? I just need to query data for
my (web) application.
I could use the “industry standard”, right?
Yeah, right• JDO 1.0, 2.0, 2.1 ?• EJB 2 (Ieek!) or 3 ?• JPA ?• J2SE ? J2EE ?
• And wait, there is more…– … Legacy code? Optimized SQL?– … Transparent or explicit persistence?
Meanwhile, outside Apache…
• Hibernate– „de facto standard“– (L)GPL licensed– driven by a single company
• TopLink Essentials– JSR 220 Reference Implementation– CDDL + GPLv2– driven by a single company
Ok, ok, ok…
So, why Apache?
Because we are at
ApacheCon…
• Apache Software License V2
– Open Source
– Commercial friendly
– Non discriminatory
• Strong community
– Many contributors
– Meritocracy
– Commercial support available
Apache Persistence Layers
• Apache Cayenne
• Apache OpenJPA
• Apache iBatis
not in this talk:• Apache Torque (http://db.apache.org/torque/)• Apache OJB (http://db.apache.org/ojb/)
Common Ground
• JDBC, JTA, JNDI
• Many popular DBs supported:– MySQL, PostgreSQL, Oracle, HSQLDB,
Apache Derby
• XML mapping definition files
• 1:1, 1:n, m:n mappings
• native and generated primary keys
Where are we?• Apache Cayenne
– 2.0.4 (Oct 12th, 2007)– 3.0M3
• Apache OpenJPA– 1.0.2 (Feb 18th, 2008)– 1.1.0-SNAPSHOT
• Apache iBatis– 2.3.1 Beta (Mar 25th, 2008)– 3.0 in planning state
• Swing GUI tool for modeling
• Ant support, maven through ant tasks
• concepts related to WebObjects EOF
Cayenne
• Pros:– GUI modeler included– Good documentation
• Cons:– all data objects inherit DataObject
(3.0 will have POJO support)– no standards compliant API
(3.0 will be JPA compliant)
• implements JPA (JSR-220)
• Ant support, maven through ant tasks
• Command line tools included
• based on Kodo, donated by BEA
• Pros:– Standards based (JPA)– POJO support– Good documentation
• Cons:– Some learning effort required– Only command line tools included
Example code
• This talk can only scratch the concepts
• Example code is availablefrom my homepage, alongwith examples for otherO/R tools:
http://henning.schmiedehausen.org/or-mappers/
http://svn.softwareforge.de/svn/opensource/talks/or-mappers/
A sample relation
firstName: Stringname: Stringmember: Boolean
People
type: Integerinfo: String
Contact
0..n
1
Cayenne propertyclass People extends CayenneDataObject {
void setFirstName(String firstName) { writeProperty("firstName", firstName);
}
String getFirstName() { return (String) readProperty("firstName");
}
Cayenne relationclass People extends CayenneDataObject {
void addToContacts(Contact contact) { addToManyTarget("contacts", contact, true);
}
void removeFromContacts(Contact contact) { removeToManyTarget("contacts", contact, true);
}
List getContacts() {return (List) readProperty("contacts");
}
Cayenne mapping<obj-entity name="People"
className="om.People"dbEntityName="people">
<obj-attribute name="firstName" type="java.lang.String"db-attribute-path="people_firstname"/>
</obj-entity><obj-relationship name="people"
source="Contact" target="People"db-relationship-path="people"/>
Class/DB Map
Prop. / Col Map
Obj Relation
OpenJPA property@Entity @Table(name="people")public class People {
private String firstName;
@Basic @Column(name="people_firstname") public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
Class/DB Map
Prop. / Col Map
OpenJPA relation@Entity @Table(name="people")public class People { private Collection<Contact> contacts;
@OneToMany(mappedBy = "people", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
public Collection<Contact> getContacts() { return contacts; }
public void setContacts( Collection<Contact> contacts) {
this.contacts = contacts; }
Class/DB Map
Obj Relation
Accessing the Mapper• Cayenne:
DataContext dataContext = DataContext.createDataContext();
• OpenJPA:
EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory();
EntityManager em = entityManagerFactory.createEntityManager();
Retrieving an Object by PK
• Cayenne:
People user = (People) DataObjectUtils .objectForPK(dataContext, People.class, 2);
• OpenJPA:
People user = (People) em.find(People.class, 2L);
Changing an Object
• Cayenne:People people = retrieve();
people.setMember(true);
dataContext.commitChanges();
• OpenJPA:Transaction tx = em.getTransaction();
tx.begin();
People people = retrieve();
people.setMember(true);
tx.commit();
And Now……for Something Completely
Different
iBATIS
• Data mapper framework
• couples SQL queries to Java objects
• Ant support, maven through ant tasks
• Abator tool / Eclipse plugin
iBATIS• Pro:
– fast, lightweight, unintrusive– Other Languages: Ruby, .NET– POJO support– Eclipse plugin
• Cons:– SQL knowledge required– „not mainstream“ concept
A mapped query<select id="getPeople" parameterClass="people"
resultMap="peopleResult">
select * from people
<dynamic prepend="where">
<isNotNull prepend="and" property="id">
people_id = #id#
</isNotNull>
</dynamic>
</select>
Query examples
• Querying a single objectPeople select = new People();
select.setId(2L);
People user = (People) sqlMap .queryForObject("getPeople", select);
• Querying a listList select = sqlMap .queryForList("getPeople", null);
Caveat
• iBatis is not an O/R mapper, it is a data mapper!
• calling retrieve() twice returns:– Cayenne, OpenJPA: The same object
– iBatis: Two different objects
Which one to use?• This table is highly subjective! YMMV!
What When
Cayenne, OpenJPA …if your Java is better than your SQL
iBATIS …if your SQL is better than yourJava / .NET
All of them …if you need J2EE integration
OpenJPA … when standards compliance is a concern
Where to go from here?• http://henning.schmiedehausen.org/or-mappers/
– Talk slides and Example code
• O/R Mappers Homepages:– http://cayenne.apache.org/– http://openjpa.apache.org/– http://ibatis.apache.org/
Other ASF persistence mappers:– http://db.apache.org/torque/– http://db.apache.org/ojb/
?
Thanks for your attention!