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:
- Databases maken gebruik van id's in plaats van intrinsieke object-identiteit;
- Objecten bevatten data, hebben een identiteit, status, gedrag (behavior), daar waar RDBMS enkel data stockeert.
- Het aantal objecten in het geheugen is typisch veel kleiner dan de hoeveelheid informatie in de database;
- DBMS komen met krachtige query-talen die het toelaten om efficïent te zoeken op indeces, maar zij zullen geen weet hebben van objecten in het programmageheugen;
- Indien een object in het geheugen gewijzigd wordt, dient de nieuwe informatie nog worden opgeslaan in de database. Dit moet gebeuren met zo weinig mogelijk connecties naar, en queries op de database ten einde de performantie hoog te houden;
- Database-systemen hebben de mogelijkheid tot transactions (met commit & rollback);
- Relaties in een database zijn impliciet en bi-directioneel;
- Vaak gebruikt men een andere logische structuur voor de objecten in het geheugen dan de tabellen in een database
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
- Ondersteuning voor overerving en polymorphisme, twee veelgebruikte programmeertechnieken;
- Kan overweg met verschillende types relaties (1 op 1, 1 op veel, ...);
- Ondersteuning voor transactions;
- Ondersteuning voor grouping (SQL: GROUP BY);
- Ondersteuning voor aggregates (SQL: SUM, AVG, MIN, MAX, ...)
- Ondersteuning voor verschillende DBMS (Oracle, Postgres, mySQL, ...);
- Query-language (Hoe krachtig is de query-taal die wordt ondersteund?);
- Data-binding
Flexibiliteit
- Aangepaste queries (Mogelijkheid om ingewikkelde SQL-queries uit te voeren);
- Ondersteuning voor SQL Join;
- Ondersteuning voor specifieke datatypes (bij bepaalde database management systemen);
- Mogelijkheid om objecten te creëren met informatie uit verschillende tabellen;
- Mogelijkheid om verschillende objecten te creëren met een zelfde eenheid data
Gebruiksvriendelijkheid
- Eenvoudige en slimme GUI;
- Automatische generatie van klassen;
- Kan een bestaande database interpreteren (niet nodig om database te modelleren vanuit applicatie)
Performance
- Globale performance (Wordt het concept van een ORM-tool goed geïmplementeerd?);
- Lazy Loading (2) (data wordt pas geladen wanneer deze nodig is);
- Query Caching;
- Caching van (sommige) data;
- Optimalisatie van queries;
- Cascade updates (bv. bij verwijderen van master-record worden ook daarvan afhankelijke records verwijderd);
- Updates / verwijderen van grote brokken informatie zonder het nodig te maken dit alles in te laden in het geheugen
Compatibiliteit
- Onderhoud;
- Mogelijkheid om over te schakelen op andere ORM-tool;
- Mogelijkheid om data op te slaan als XML-file;
- Ondersteuning voor gedistribueerde systemen (web services)
Meer
- Aanduiding van status van een object;
- Ondersteuning voor off-line mode (tijdelijk werken zonder connectie met database);
- Filteren van objecten in het geheugen;
- Mogelijkheid tot loggen;
- Mogelijkheid tot kiezen wanneer een database wordt upgedate
Andere
Criteria niet specifiek aan een ORM-tool:
- Prijs;
- Performantie;
- Geheugengebruik;
- Scalability;
- Complexity;
- Gebruiksgemak;
- Flexibiliteit;
- Documentatie en ondersteuning;
- Maturiteit (nieuw project, alpha / beta?);
- Blijvend product / kans dat de ontwerper ermee ophoudt;
- Beschikbaarheid broncode;
- Ondersteuning voor verschillende platformen (Java en .Net? Windows en Linux?);
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:
- Een klasse per tabel (attributen voor elke kolom);
- 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:
- Codus (Gratis)
- Codesmith (Gratis/$)
- CSLA (Rocky Lhotka) (Gratis)
- DataObjects.NET ($$)
- Deklarit ($$)
- EntityBroker (Gratis/$$)
- Genome (Gratis/$$)
- Gentle.NET (Gratis)
- Ironspeed ($$)
- LLBLGen Pro ($)
- Modularis ($$$)
- Neo - .NET Entity Objects (Gratis)
- NHibernate (Gratis)
- NPersist (Gratis)
- NOrca (Gratis)
- ObjectMapper ($)
- Objectz.NET ($)
- OPF.NET ($$)
- ORM.NET (Gratis)
- RapTier (Gratis/$$)
- Sooda (Gratis)
- Visual Developer ($$/$$$)
- WilsonORMapper ($)
- XPO - Express Persistent Objects ($$)
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.
- http://madgeek.com/Articles/ORMapping/EN/mapping.htm
- http://www.nljug.org/pages/articles/members/tukker_hibernate/
- http://www.service-architecture.com/object-relational-mapping/articles/
- http://www.whitehorses.nl/whitebooks/041201.html
- http://www.ambysoft.com/mappingObjects.html
- http://www.jdocentral.com/
- http://en.wikipedia.org/wiki/Object-relational_mapping
- http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=78&t=000010
- http://blog.ianbicking.org/successful-orm-use.html
- http://www.objectmatter.com/vbsf/docs/maptool/ormapping.html
- http://www.chimu.com/publications/objectRelational/
- http://www.agiledata.org/essays/mappingObjects.html
- http://c2.com/cgi/wiki?ObjectRelationalToolComparisonDotNet
- http://c2.com/cgi/wiki?ObjectRelationalToolComparison
- SharpToolbox' Object-Relational Mapping category
- JavaToolbox' Object-Relational Mapping category
- SharpToolbox' Persistence - Data-tier category
- SharpToolbox' Code Generation category
- http://weblogs.asp.net/fbouma/archive/2004/10/09/240225.aspx
Meer in zoekmachines:
- http://del.icio.us/tag/orm
- http://www.technorati.com/cosmos/search.html?rank=&url=object+relational+mapping
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
