Introduction to ORM-Tools

Abstract

This paper is an introduction to Object-Relational Mapping Tools. The issues covered include the idea behind ORM-Tools, an overview of the technical issues that one has to consider, criteria when choosing an ORM-tool for your application, a classification of tools based on the different approaches and a review of some tools for Java and .NET environments. This paper is written in Dutch.

Inleiding

In dit paper geef ik een technisch beschrijving van de object-relational mappingtools, momenteel op de markt. Eerst en vooral wordt er gekeken naar wat Object-Relational Mapping inhoudt. Daarna gaan we verder in op de verschillende principes waarop verschillende types tools zijn gebaseerd en maken we een classificatie. Daarna vergelijken we verschillende ORM-Tools en bespreken we deze. Welke mogelijkheden zijn er? Welke worden het meeste gebruikt? Wat is de impact op de performantie?

Het dient gezegd dat de auteur op het moment van schrijven geen praktijkervaring heeft/had met welke ORM-tool dan ook. Ook is er niet voldoende tijd voor handen, noch mogelijkheid om de tools aan te leren en gebruiken. De informatie in deze paper is dan ook gebaseerd op documentatie bij de tools en op artikels van anderen. Dit paper is geschreven in het kader van een opdracht voor het vak Databanken in de opleiding Industrieel Ingenieur, Electronica/ICT aan de katholieke hogeschool St. Lieven te Gent.

Mocht u opmerkingen, vragen of correcties hebben, gelieve mij te contacteren op: jurriaan.persyn@student.kahosl.be.

Met vriendelijke groeten,
Jurriaan Persyn

Over ORM

Persistentie
Zo goed als elke applicatie moet overweg kunnen met data; ophalen, bewerken, opslaan.
Gegevens in een applicatie worden typisch vastgelegd in objecten. Deze objecten kennen een beperkte levensduur, want op het moment dat de applicatie wordt beëindigd, worden de objecten vernietigd en zijn de gegevens ‘verdwenen'. Om de gegevens vast te leggen, kunnen ze worden opgeslagen - ofwel persistent gemaakt - in bv. een database.

Object Databases?
In zo goed als alle gevallen zijn dit relationele database-systemen waar de informatie wordt opgeslaan in een aantal tabellen (rows & tuples). Er zijn pogingen om object databases te gebruiken. Er is echter weinig consensus over hoe dit moet worden aangepakt en vaak zorgt een dergelijke aanpak voor het wegvallen van een aantal voordelen van relationele database systemen. Dit heeft ervoor gezorgd dat object databases niet populair zijn en meestal een SQL DBMS wordt gebruikt. Hierbij is echter een conversie nodig van de informatie van object naar record en vice versa. Dit gebeurt typisch door een Object - Relational Mapping tool.

Taak van een ORM-tool
Een Object - Relational Mapping tool heeft als taak een link te leggen tussen beide en zodoende te assisteren bij het persistent maken van de data. Hun doel is het vereenvoudigen van de toegang tot en het opslaan van data.
Een probleem bij het opslaan van objecten is dat de structuur van de gegevens in een object vaak afwijkt van de structuur van het gegevensmodel in de database. In een relationele database zijn gegevens afkomstig van 1 object soms verspreid over meerdere tabellen. Het blijkt al snel dat we te maken hebben met twee heel verschillende werelden: enerzijds programmeren we in een object-geörienteerde wereld die is afgeleid uit bewezen programmeertechnieken, en anderzijds slaan we onze data op in een relationele wereld die gebaseerd is op bewezen wiskundige principes. Dit alles zorgt ervoor dat deze software vaak erg gecompliceerd is.
( Terzelfdertijd werken ontwerpers van SQL DBM systemen aan manieren om gegevens als objecten op te slaan.)

De perfecte tool?
Er bestaan verschillende manieren waarop een ORM-tool zijn taak kan vervullen, uitgaande van een aantal verschillende principes. Er bestaat dan ook een heel uitgebreid gamma aan ORM-Tools. Elke tool heeft z'n voordelen en z'n tekortkomingen. Het is belangrijk de juiste tool voor de juiste applicatie te kiezen, maar vaak is dit een proces van trial and error.
Helaas is geen enkele de perfecte tool voor iedere situatie en vergt een ORM-tool vaak een moeilijke leercurve.

Verschillen

ORM-Tools leggen de link tussen relationele records in een database en objecten in het geheugen van een applicatie. Er zijn een aantal fundamentele verschillen tussen beide. Een overzicht:

Een ORM-tool zal alle interactie tussen applicatie en data-objecten onderscheppen om te zorgen voor een goede persistentie. Er bestaan verschillende technieken om dit te doen, en zij zullen later in deze paper een basis vormen voor een classificatie van de verschillende ORM-Tools.

Datacentrisch vs. objectcentrisch
Er is dus een verschil in aanpak van applicatieontwerp en -ontwikkeling. Voor de programmeur is het objectmodel (ook wel domeinmodel genoemd) leidend. Deze aanpak noemen we de objectcentrische aanpak. De traditionele database-ontwikkelaar is gewend daarentegen om bij de bouw van een nieuwe applicatie te starten met het analyseren van de gegevensbehoefte. Deze aanpak, waarbij het ontwerp en de ontwikkeling wordt benaderd vanuit het gegevensmodel, noemen we de datacentrische aanpak.

Criteria voor ORM-Tools

Als je op zoek gaat naar de perfecte ORM-tool voor jouw applicatie is het interessant om eerst eens te kijken naar de criteria waaraan je je tool wil toetsen. Hierna volgt een (onvolledige) lijst van (mogelijke) criteria, gegroepeerd per categorie;

Basisfunctionaliteit

Flexibiliteit

Gebruiksvriendelijkheid

Performance

Compatibiliteit

Meer

Andere

Criteria niet specifiek aan een ORM-tool:

Principes

Zoals eerder vermeld zijn er heel verschillende types van ORM-Tools. Afhankelijk van het principe waarop ze zich baseren, proberen we een classificatie op te stellen. Basis voor deze classificatie is de paper 'Object-Relational Mapping Tools' van Anthony Berglas (5 December 2002). Deze bespreekt echter enkel Java-tools en dateert van december 2002. Er werden echter weinig andere interessante classificatie-systemen gevonden, dus nemen we deze hier over.

Primitive Mappers without Identity

Dit type tools zijn een eenvoudige hulp bij het omzetten van een record in een object; ze automatiseren het schrijven van eenvoudige select/update-queries. Interacties met de database dienen expliciet opgegeven te worden en ook het up to date houden van de database met gewijzigde objecten gebeurt niet automatisch. Bij dit soort tools is het mogelijk dat er verschillende objecten aanwezig zijn met informatie uit eenzelfde rij.

Voorbeelden: SQL2Java (S2J) , TableGen , JGrinder , DataBind , CrosDB.

Direct Mappers with Identity

Deze tools zijn te verkiezen boven tools "without identity" omdat ze het identiteitsprobleem oplossen door een index van alle gecreërde objecten bijhouden (gebaseerd op de primary key).
Een groot nadeel bij deze tools is nog het niet aanwezig zijn van features als lazy loading (door directe access van instantie-variabelen), waardoor ze enkel geschikt zijn voor kleinere projecten.

Voorbeelden: Castor/JDO, JrelationalFramework, Turbine/Torque, Hibernate, iBatis Database Layer

J2EE EJB 2 CMP Tools

De J2EE Entity Bean Standaard definieert het gebruik van abstracte klassen. Dergelijke tools maken vaak grote hoeveelheden code aan, zelfs voor simpele projecten.

Voorbeelden: Weblogic , JAWS (JBOSS) .

Sun JDO-Style Byte Code Post Processors

Deze categorie tools zullen de geschreven code achteraf bewerken; zogenaamd post-code-processing. Alle code wordt doorzocht en daar waar hulp van een ORM gewenst is, wordt ze aangepast. Dit betekent dat alle klassen moeten doorzocht worden. Hierbij bestaat het gevaar voor conflicten met andere post-processors en worden er ook een aantal veronderstellingen gemaakt over hoe de code werkt.

De tools voorzien ook in een eigen query taal: JDOQL. Dit is een simpele, maar effectieve taal.

Voorbeelden: ObjectRelationalBridge, SolarMetric KodoJDO, JavaBlend

Generalized Design Based Mappers

Generalized Design Based Mappers vereisen een aparte behandeling van persistente objecten. Toegang tot de informatie in een persistent object gebeurt op een speciale manier waardoor alle acties ernaartoe kunnen onderschept en gemonitored worden. Er is maar weinig code nodig om object definities te creëren en er wordt gebruik gemaakt van voorgedefinieerde events.

Voorbeelden: SimpleORM, WebObjects / Enterprise Object Framework EOF

Generators, Proxies, Relationship Objects, Other Tricks

De aanpak van deze tools bestaat uit het opmaken van definities in XML. Deze definities laten dan toe de Java-code te genereren. (Het is hierbij essentieel dat de gegenereede code later nooit wordt aangepast.)

Er wordt vaak gebruikt gemaakt van Java 1.3 proxy objecten om objecten voor te stellen, die lazy-loading mogelijk maken. Men stelt relaties soms ook voor als expliciete objecten in plaats van naar een ander te verwijzen. Deze werkwijzen resulteren in extra complexiteit, maar zijn te verkiezen boven post-code-processing of entity-bean aanpak.

Voorbeeld: Jaxor

Overzicht beschikbare tools

De classificatie van de onderstaande tools is gebeurd op basis van de bovenstaande design principles en op basis van de programmeertaal (Java en .NET). Het is vaak niet eenvoudig om een tool in een enkele categorie te plaatsen. Wat volgt moet bijgevolg met enige voorzichtigheid worden behandeld.

Het is interessant om hier een quote van Anthony Berglas aan te halen:

"I wish that people that develop tools would take the trouble to explain what problems they are really trying to solve, and how they compare with other tools and techniques. "We chose this approach instead of that approach because...". Too often they just jump into a detailed user guide, or worse, the JavaDoc. The big issues are hidden between the lines ..."

Java

Primitive Mappers without Identity

SQL2JAVA

Website: http://www.bitmechanic.com/projects/s2j
SQL2JAVA genereert twee types klassen:

  1. Een klasse per tabel (attributen voor elke kolom);
  2. Een manager-klasse die de SQL bevat voor CRUD-operaties

Direct Mappers with Identity

Castor/JDO

Website: http://www.castor.org/

Castor is an Open Source data binding framework for Java[tm]. It's the shortest path between Java objects, XML documents and relational tables. Castor provides Java-to-XML binding, Java-to-SQL persistence, and more.

Castor is een open source project met belangrijkste feature data binding d.m.v. xml. Het is echter ook een ORM-tool dankzij z'n JDO, die overigens weinig te maken heeft met die van Sun.

Turbine/Torque

Website: http://db.apache.org/torque/
Torque is het database project van Apache. Er is goede ondersteunig voor "SQL Join" en voor een hele reeks RDMBS.

Hibernate

Website: http://www.hibernate.org/

Hibernate is a powerful, ultra-high performance object/relational persistence and query service for Java. Hibernate lets you develop persistent classes following common Java idiom - including association, inheritance, polymorphism, composition and the Java collections framework. The Hibernate Query Language, ... , provides an elegant bridge between the object and relational worlds. Hibernate also allows you to express queries using native SQL or Java-based Criteria and Example queries. Hibernate is now the most popular object/relational mapping solution for Java.

All SQL database management systems are supported. Of course, Hibernate integrates elegantly (and without restrictions) with all popular J2EE application servers and web containers. Hibernate can also be used in standalone Java applications. ...

Hibernate is Free Software. ...

Zoals men op de website zelf vermeld is Hibernate momenteel de populairste ORM-oplossing voor Java-applicaties. We hebben Hibernate hier ondergebracht bij "Direct Mappers With Identity" en in de beschrijving vermeld dat er nog een aantal belangrijke features ontbreken in dit type tools. Nieuwere versies van Hibernate lijken hier wel met uitgerust te zijn.
Op de website van J. Roller vind je een aantal handige Hibernate tips en ook de website van Hibernate herbergt een schat aan informatie.
Dat ook deze applicatie niet dé perfecte tool is bewijst deze discussie over het verwijderen van een hele reeks objecten.

iBatis Database Layer

Website: http://www.ibatis.com/common/common.html

iBATIS SQL Maps provides a very simple and flexible means of moving data between your Java objects to a relational database. Use the full power of real SQL without a single line of JDBC code!

Toegang tot de data gebeurt via z'n specifieke 'SQL Map'.

Sun JDO-Style Byte Code Post Processors

ObjectRelationalBridge (OJB, Object Relational Bridge)

Website: http://db.apache.org/ojb/

OJB supports multiple persistence APIs to provide users with their API of choice, including ODMG 3.0, JDO, Object Transaction Manager

OJB has been designed for a large range of applications, from embedded systems to rich client application to multi-tier J2EE based architectures.

OJB uses an XML based Object/Relational Mapping. The mapping resides in a dynamic MetaData layer which can be manipulated at runtime through a simple Meta-Object-Protocol (MOP) to change the behaviour of the persistence kernel.

OJB provides several advanced O/R features like an Object Caching, lazy materialization through virtual proxies or a distributed lock-management with configurable Transaction-Isolation Levels. Optimistic and pessimistic Locking is supported.

Deze open source tool vergt veel code nodig en ook een grote XML file.

Generalized Design Based Mappers

SimpleORM

Website: http://www.simpleorm.org/

... open source project ... No XML file to configure

... Minimal reflection, no pre processing, and no byte code post processing. ...

... Locking, quality of information, and caching are all treated properly. SimpleORM allows allows for raw JDBC and non-Java database access and constraints without compromising database integrity. Optimistic locks are used for inter-transaction locking. ...

Apple WebObjects

Website: http://www.apple.com/webobjects/

WebObjects gives you the ability to build or use standards-based web services without writing low-level SOAP, XML or WSDL.

WebObjects is een commerciëel product van Apple. De tool helpt je bij het bouwen van allerlei server applicaties in Java. Intern bevat het ook een ORM-component.

Hybride:

Oracle oplossingen

Oracle heeft twee ORM-tools ter beschikking. Afhankelijk of je project data- of objectcentrisch is opgesteld gebruik je BC4J resp. Toplink. Meer info op de website van Oracle.

Business Components for Java (BC4J)

BC4J is Oracle’s ORM oplossing voor bedrijven die gewend zijn om datacentrisch te ontwikkelen.
BC4J maakt het mogelijk om op eenvoudige manier, bijvoorbeeld met behulp van JDeveloper, een datamodel in te lezen en op basis hiervan een serie objecten te laten genereren. Het ophalen en wegschrijven van gegevens gebeurt verder via deze business components.

Het ophalen van gegevens gebeurt door het aanroepen van methodes op de gegenereerde objecten. Er is geen sprake van een uitgebreide query taal.

Toplink

Toplink is Oracle’s ORM oplossing voor de objectcentrische aanpak. Toplink is geschikt voor het definiëren van de persistentie van willekeurige Java objecten (POJO) en Enterprise Java Beans (EJB’s) in zowel bestaande, als nieuwe database structuren.

Een sterk punt van Toplink is de object cache. Voor het ophalen van gegevens (objecten) heeft Toplink de expression builder.

Omdat binnen Toplink het objectmodel leidend is, is er over het algemeen sprake van éénrichtingsverkeer van de Toplink cache naar de database. Dit betekent dat bij een stroomstoring, of een proces dat gegevens in de tabellen wijzigt, er corruptie van data kan optreden.

Op de volgende url vind je een vergelijking van de twee Oracle tools.

.Net

De auteur van deze paper heeft geen ervaring met c# en/of het .Net-framework. Volgende lijst van ORM-Tools voor het .NET-framework werd samengesteld door Hundhausen op Tales from the doghouse:

Meer

Op de website ortools.warneronstine.com worden een aantal praktijkvoorbeelden bijgehouden die werken met verschillende mapping tools.

Bronnen & referenties

Dit paper was gebaseerd op artikels van volgende websites (naast diegene hierboven reeds vermeld). De lijst is aangevuld met enkele andere interessante links voor verdere lectuur.

Meer in zoekmachines:

Slot

Er bestaat een grote markt van ORM-tools, elk met hun eigen kenmerken, features en afwijkingen. Hieruit een keuze maken voor een eigen project is niet eenvoudig.

De keuze voor een tool houdt in dat we goed weten wat we verwachten van het project en dat we goed weten wat we verwachten van de tool.

Vaak is het zo dat eenmaal we gekozen hebben voor een bepaalde tool, het moeilijk is om over te schakelen naar een andere tool, wat de keuze des te moeilijker en ingrijpender maakt.

Met vriendelijke groeten,
Jurriaan Persyn