NHibernate als ORM oplossing



Vergelijkbare documenten
Sparse columns in SQL server 2008

Databases - Inleiding

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

Visualisatie van een databank met behulp van JPA

1. * Database worden vaak gebruikt in Client-Server architectuur.

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

INLEIDING... 1 AFSPRAKEN... 2 INHOUDSOPGAVE...

Elementary Data Structures 3

Access voor beginners - hoofdstuk 25

Technische nota AbiFire Rapporten maken via ODBC

Object Oriented Programming

INFITT01 - Internettechnologie WEEK 8

Software Test Plan. Yannick Verschueren

Koppeling met een database

Kleine cursus PHP5. Auteur: Raymond Moesker

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Les 15 : updaten van gegevens in de database (deel2).

Dataconversie met Oracle Spatial

Mijn eerste ADO.NET applicatie

Handleiding voor Zotero versie 2.0

Een website maken met databasetoegang.

Technisch Ontwerp W e b s i t e W O S I

Na bestudering van dit hoofdstuk moet je tot het onderstaande in staat zijn:

Orbis Software. Portal4U. Installatie Handleiding. Dit document bevat de Installatie Handleiding voor Portal4U

MA!N Rapportages en Analyses

Systeemontwikkeling, Hoofdstuk 4, Tabellen maken in MS Access 2010

Elastic Search wat heb je aan data als je er niets mee doet.. Oscar Buse 11 juli 2017 Linux User Group Nijmegen

Toon TITEL, JAAR en PLATVORM van GAMES die voor het jaar 2000 uitkwamen op Nintendo 64

Hoofdstuk: 1 Principes van databases

Databases en SQL Foundation (DBSQLF.NL)

[TOETS SQL INLEIDING]

Service Data Objects. Wat is SDO? Dynamic data API

Capita Selecta Design Patterns voor administratieve applicaties

Beheer van databanken

Gebruikers handleiding. Lizard Configuration Manager ToolTip. Installatie. Instellen. Initieel instellen

Secure Application Roles

Fun met webparts in ASP.Net

Query SQL Boekje. Fredrik Hamer

DATAMODEL SQL. Middelbare School. Versie 1.0 Datum 30 oktober 2010 Auteur Mark Nuyens, studentnummer: Groep TDI 1

opstarthandleiding mysqlworkbench November 2012 Fons van Kesteren HVA- CMD- V1 Datamodelleren

Elfde-Liniestraat Hasselt Schooljaar TINFO POKER GAME Oracle Scripts

WCF claims-based authorization

Technische nota AbiFire5 Rapporten maken via ODBC

Les 11 : Basis SQL (deel2).

Handleiding - Aanmaken van SQL server gebruiker

MVC BASICS 2. Kevin Picalausa

Op de Virtual Appliance is MySQL voorgeïnstalleerd. MySQL is momenteel de meest gebruikte database op het internet.

Organiseer uw verschillende SOAP services in één scenario

Programmeren in Java 3

Het omzetten van een ER-diagram naar SQL

Rodin installatiehandleiding (vanaf versie 2.1.xxx.x)

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

De MySQL C API. Variabelen in C Functies in C Pointers in C

ALL-CRM Gebruikers Handleiding AC-DataClean 7.0

Handleiding configuratie en gebruik tekenmodule

Shopt IT 2014 Ivo Depoorter Pagina 2 van Belangrijkste doeleinden logon scripts. 2 Klassieke werkwijze

Ontwerp een datamodel

Software Design Document

SQL Aantekeningen 3. Maarten de Rijke 22 mei 2003

Gebruikers Handleiding

ASRemote WebService. Via deze webservice kunt u:

Handleiding 2Voice Software Android

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn.

Mailmerge Auteur : Reint Endendijk Versie : 1.0 Datum : 25 juni 2010

SQL datadefinitietaal

5/5 Red Carpet. 5/5.1 Inleiding

Versie: 1.1 Datum: Handleiding Portal HostedXL

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

Software Requirements Specification

EXIN Databases en SQL Foundation

Portal4U 1.4 Installatie

OFFICE A LA CARTE - ACCESS 2013

Maximo Tips and Tricks

In een klassendiagram worden klassen beschreven in termen

ORBIS SOFTWARE BENELUX BV RELEASE NOTES WORKFLOW4U Release Notes WORKFLOW4U. Versie ORBIS SOFTWARE BENELUX BV

Versie : Releasedatum : Geschikt voor Synergy Enterprise : v.a. batch 249

Een introductie tot gegevensbanken

Coachview.net Eenmalige Imports

Informatie & Databases

Programmeren in Java 3

MADASTER PLATFORM. IFC export in BIM software. Archicad 21 & Revit 2019

Implementatie AssurePay ASP.NET. ideal

SQL STATEMENTS. Deze kolom kan grote stukken tekst aan en is bedoeld om tekst erin de plaatsen. Geheel getal, bijvoorbeeld 8, 63, 835 NUMERIC

Installatiehandleiding Business Assistent

Opdracht 7a. Applicatiebouw 2014/2015

Les S-01: De basisbeginselen van SQL

Installatiehandleiding Business Assistent

Perceptive Process. Release Notes. Version: 3.5.x

Excel Controller. Jaarrekening

Excel Controller. Jaarrekening

Transcriptie:

NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een databasemodel en verzorgt de koppeling tussen deze twee modellen. NHibernate is een afgeleide van Hibernate de bekendste OR-Mapper in de Java-wereld. In dit artikel behandelen we mapping, CRUD-operaties en de Criteria API. NHibernate als ORM oplossing Door gebruik te maken van NHibernate hoeven we ons geen zorgen meer te maken over SQL, deze wordt namelijk volledig gegenereerd. De standaard operaties voor het aanmaken, lezen, wijzigen en verwijderen zijn zonder queries uit te voeren. Ingewikkelde queries voor het inlezen van collecties kunnen worden uitgevoerd middels de Criteria API, welke we in dit artikel zullen behandelen. Naast de Criteria API kan er ook gebruik gemaakt worden van Hibernate Query Language (HQL) en Query by Example voor het uitvoeren van complexe queries. Deze mogelijkheden zullen we verder niet behandelen in dit artikel. Door gebruik te maken van NHibernate als OR-Mapper kan optimaal gebruikgemaakt worden van functionaliteit binnen SQL Server, aangezien NHibernate 1.2 nu ook Stored Procedures ondersteunt. Virtual Book Shelf In dit artikel gebruiken we als voorbeeld een applicatie welke kan dienen als de virtuele boekenplank voor een bedrijf. Met wat uitbreiding van de functionaliteit die we behandelen kunnen medewerkers inzien welke boeken het bedrijf heeft en welke medewerker het specifieke boek in bruikleen heeft. Het objectmodel bestaat uit de objecten Boek en Medewerker welke in codevoorbeeld 1 en 2 zijn uitgewerkt. De standaard get / set properties zijn voor dit artikel niet van belang en hebben we dus ingekort. De relatie Boek wordt geleend door Medewerker is geïmplementeerd door Medewerker als eigenschap van Boek op te nemen. Deze relatie bekeken vanuit het Medewerker object, Medewerker leent Boeken, hebben we gerealiseerd door een generic List van het object Boek op te nemen als eigenschap van Medewerker. Deze gekozen implementatie wijkt niet af van de standaard wijze waarop deze relatie in een objectmodel wordt geïmplementeerd. Dit is een compleet andere aanpak dan het gebruik van het Dataset object, typed of untyped. Bij datasets werk je met een objectmodel dat erg lijkt op de benadering van de database. Bij het gebruik van TableAdapters worden nog vaak SQL queries aangepast zodat ze aan de eisen voldoen. Het gebruik van NHibernate zorgt ervoor dat SQL queries tot het verleden behoren. De standaard CRUD operaties vereisen slechts een correcte mapping. Voor complexere queries kan gebruikgemaakt worden van de Criteria API. De mapping, CRUD operaties en de Criteria API behandelen we in de volgende paragrafen. 1 namespace QNH.VirtualBookShelf

2 8 9 10 11 12 1 1 1 1 1 18 19 20 21 22 2 2 2 2 2 28 29 0 1 2 1 2 8 9 10 11 12 1 1 1 1 1 18 19 20 21 22 2 [Class] public class Boek [Id(Name = "BoekId", Access = "field.camelcase-underscore")] [Generator(1, Class = "native")] private int _boekid; private string _titel; private string _auteur; private string _isbn; private Medewerker _lener; public virtual string Titel... public virtual string Auteur... public virtual string Isbn... [ManyToOne(Cascade = CascadeStyle.SaveUpdate, Column = "LenerId")] public virtual Medewerker Lener... Codevoorbeeld 1: Definitie van het boek object en de mapping naar de database. using System.Collections.Generic; using NHibernate.Mapping.Attributes; namespace QNH.VirtualBookShelf [Class(Lazy=false)] public class Medewerker [Id(Name = "MedewerkerId", Access = "field.camelcaseunderscore")] [Generator(1, Class = "native")] private int _medewerkerid; private string _voornaam; private string _achternaam; private string _email; private IList<Boek> _boeken = new List<Boek>(); public virtual string Voornaam... public virtual string Achternaam

2 2 2 2 28 29 0 1 2 8 9 0 1 2... public virtual string Email... [Bag(Lazy = false)] [Key(1, Column = "LenerId")] [OneToMany(2, ClassType=typeof(Boek))] public virtual IList<Boek> Boeken... public void BoekToevoegen(Boek boek) boek.lener = this; Boeken.Add(boek); Codevoorbeeld 2: Definitie van het medewerker object en de mapping naar de database. Mappen naar de database De relatie tussen het objectmodel en de database leggen we vast middels de mapping. De eerste stap is aangeven dat het hier om een object gaat dat mapt op een database tabel (zie codevoorbeeld 1). Zoals in het codevoorbeeld te zien is geven we niet aan wat de naam van de tabel is. Het opgeven van namen is ook voor kolommen niet altijd noodzakelijk. De intelligentie van NHibernate weet zelf op welke tabel en kolommen er wordt gemapt wanneer de namen overeenkomen. In de mapping word per property in het objectmodel aangegeven bij welke kolom in de database deze hoort. Daarnaast bestaat er een speciale mapping voor id-velden. Voor id-velden kan aangegeven of het id in de database gegenereerd moet. Aangezien het id-veld in veel gevallen geen echt onderdeel van het objectmodel is, is het beter om deze te verbergen. Voor dit id-veld wordt geen property aangemaakt, maar wordt rechtstreeks op het veld gemapt. Naast het mappen van de standaard properties is de echte toegevoegde waarde te vinden in de relaties tussen objecten. De relatie die we in de database wereld een één-op-veel noemen is ook aan te brengen in het objectmodel. Vanuit ons voorbeeld betekent dit dat iedere medewerker meerdere boeken kan lenen. Deze relatie kan mappen door aan te geven dat het om een lijst gaat, waarbij aangegeven is welke kolom als sleutel geldt. De laatste stap voor het mappen van deze relatie bestaat uit het aangeven van welk type object het een lijst is. Bij een bi-directionele relatie kan de relatie van twee kanten benaderd worden. Om deze relatie ook in het objectmodel te laten werken dient bij het toevoegen van een boek aan een medewerker, ook de lener van het boek gezet te worden. In het voorbeeld maken we gebruik van attributen voor het vastleggen van de mapping. Het is echter ook mogelijk gebruik te maken van XML-Files voor het vastleggen van de mapping deze mogelijkheid behandelen we niet in dit artikel. Uitvoeren van CRUD operaties De communicatie tussen een applicatie en een onderliggende database bestaat uit de zogenaamde CRUD operaties (Create, Read, Update en Delete). In SQL betekent dit dat er

insert, select, update en delete queries gemaakt moeten worden. Als eenmaal de mapping tussen de database en het objectmodel is ingesteld kunnen de CRUD-operaties aangeroepen worden. Het aanmaken van een nieuwe medewerker bestaat uit de aanroep van het SaveOrUpdate commando met als argument de nieuwe medewerker. Dit commando bevat logica om te controleren of het om een nieuw of bestaand object gaat en zal op basis daarvan een insert of update query uitvoeren. Voor het uitlezen van een object is de sleutel noodzakelijk. Meestal zal de sleutel in een id-veld opgeslagen worden. Als de sleutel bekend is kan het Load commando gebruikt worden. Echter wanneer de sleutel niet bekend is, kan er altijd gebruik gemaakt worden van de Criteria API voor het opzoeken van objecten. Zoals al aangegeven is het commando voor het aanmaken gelijk aan het bijwerken. Echter wanneer het object is gebruikt buiten een NHibernate sessie om, weet NHibernate niets meer van het object. Voordat het SaveOrUpdate commando aangeroepen kan worden moet dan ook de status van de instantie worden ververst middels het Refresh commando. Ook bij het verwijderen van een instantie moet eerst de status worden bijgewerkt, alvorens het Delete commando aan te roepen. Create using (ISession session = _sessionfactory.opensession()) Medewerker medewerker = new Medewerker(); medewerker.voornaam = "John"; medewerker.achternaam = "Doe"; medewerker.email = "john.doe@microsoft.com"; session.saveorupdate(medewerker); Read using (ISession session = _sessionfactory.opensession()) Medewerker medewerker; medewerker = session.load<medewerker>(medewerkerid); session.delete(medewerker); Update using (ISession session = _sessionfactory.opensession()) session.refresh(medewerker); session.saveorupdate(medewerker); Delete using (ISession session = _sessionfactory.opensession()) session.refresh(medewerker); session.delete(medewerker); Tabel 1: De create, read, update en delete operaties uitgewerkt voor het Medewerker object. Eén van de voordelen van het gebruik van NHibernate is lazy loading. Wanneer we bijvoorbeeld alle medewerkers inladen en we geen gebruikmaken van de boeken die een medewerker in bruikleen heeft, willen we deze boeken niet onnodig inlezen. NHibernate heeft hier een oplossing voor, genaamd lazy loading. Standaard heeft NHibernate op iedere collectie lazy loading geïmplementeerd, in sommige gevallen is dit niet wenselijk en kan het handmatig worden uitgezet.

Queries met de Criteria API De communicatie tussen een applicatie en de database bestaat grotendeels uit CRUD operaties. Echter het resterende gedeelte van de communicatie met de database bestaat veelal uit complexe joins met meerdere condities. NHibernate ondersteunt ook complexe joins en condities. Echter zoals we tot nu toe gewend zijn, gebruiken we tijdens de communicatie met NHibernate geen SQL. NHibernate ondersteunt deze queries via twee interfaces. Er kan gebruikgemaakt worden van HQL een objectgeoriënteerde query taal die erg lijkt op SQL. Maar het opbouwen van een query met de Criteria API zorgt voor een echte objectgeoriënteerde query. De query in codevoorbeeld zoekt alle medewerkers waarvan het e-mailadres eindigt op @qnh.nl. NHibernate zet de query zelf om in een echte SQL query, zodat de query ook daadwerkelijk op de database wordt uitgevoerd, zodat de kracht van de database gebruikt wordt. 1 2 IList<Medewerker> medewerkersqnh; using (ISession session = _sessionfactory.opensession()) ICriteria criteria = session.createcriteria(typeof (Medewerker)); criteria = criteria.add(expression.like("email", "%@qnh.nl")); medewerkersqnh = criteria.list<medewerker>(); Codevoorbeeld : Zoek medewerkers met een e-mail adres dat eindigt op @qnh.nl. Conclusie Met dit artikel hebben we NHibernate geïntroduceerd. Naast de mapping heeft dit artikel de CRUD-operaties en de Criteria API behandeld als alternatief voor sql-queries. NHibernate heeft nog veel andere features die we niet behandeld hebben, zoals transacties en inheritance. Voor meer informatie kan gekeken worden op www.nhibernate.org. Referenties: www.nhibernate.org Mark Monster is Software Engineer en Christian Siegers is Architect/Software Engineer bij QNH Solutions.