pátek 18. června 2004

ORM letem světem

Do základní architektury správné webové aplikace patří persistence vrstva. Záměrně používám anglického výrazu neboť označení datová vrstva mi přijde trochu zavádějící v souvislosti s třívrstvým modelem.

Proč persistence vrstva a ORM

Základní vlastností persitence vrstvy je odstínit vyšší vrstvy, především business vrstvu, od konkrétního datového zdroje. To má půvab v jednoduché změně backendu (datového zdroje) v pozadí, bez nutnosti změny v aplikačním kódu.

Způsobů jak výše uvedeného dosáhnout je několik, ale troufám si tvrdit, že ten nejpoužívanější je mapování objektu na relace tzv. ORM. Mapování je způsob jakým vyjadřujeme relace pomocí objektů.

Představme si případ kdy máme v relační databázi tabulku pro zaměstnance a tabulku pro jejich telefonní čísla. Při mapování nám v takovém případě vzniknou dva objekty, jeden odpovídá tabulce zaměstnanec (sloupečky tabulky odpovídají rozhraní objektu) a druhý tabulce telefonních čísel. Zároveň při mapování vyjádříme relaci 1:n mezi zaměstnancem a telefonním číslem, mezi objekty je tento vztah realizován pomocí vnořených kolekcí.

V aplikační logice pak nepíšeme SQL dotazy, ale jejich obdoby pro daný OR framework např. Hibernate má jazyk HQL (Hibernate Query Language). Výsledkem takového dotazu je pak objekt nebo kolekce objektů, v našem fiktivním případě by dotaz select z from Zamestnanec z where z.prijmeni = ? vrátil objekt nebo kolekci objektů Zamestnanec.

OR frameworky nabízejí báječné rozhraní pro objekty. Představme si, že máme formulář pro zadávání nových zaměstnanců, odesláním takového formuláře můžeme vytvořit v aplikační logice objekt Zamestnanec, který díky namapování (objektu Zamestanec odpovída tabulka zamestnanec) a provolání specifické metody frameworku pro ukládání objektu, tohoto zaměstnance uložíme.

Nutnost specifikace persistence vrstvy vedla k vytvoření rozhraní JDO (Java Data Objects), které unifikuje jednotlivé aspekty, které byly proprietárně řešeny jednotlivými frameworky. Pro další studium bych doporučoval článek Scotta W. Amblera The Fundamentals of Mapping Objects to Relational Databases a Richarda Hightowera Object-relation mapping without the container nebo porovnání jednotlivých ORM frameworku.