{"id":83,"date":"2016-02-13T18:42:30","date_gmt":"2016-02-13T17:42:30","guid":{"rendered":""},"modified":"2018-09-17T21:52:33","modified_gmt":"2018-09-17T19:52:33","slug":"java-persistent-api-alebo-orm-v-enterprise-jave","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/java-persistent-api-alebo-orm-v-enterprise-jave\/","title":{"rendered":"Java Persistent API alebo ORM v enterprise Jave"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/dsfdsa56f4.jpg\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"215\" \/>ORM je skratka v\u00fdrazu Object-Relation Mapping, \u010do je princ\u00edp toho, \u017ee sa \u00fadaje ulo\u017een\u00e9 v rela\u010dnej datab\u00e1ze namapuj\u00fa na objekty v pam\u00e4ti alebo naopak. Je to \u010dasto d\u00f4le\u017eit\u00fd premos\u0165ovac\u00ed prvok medzi t\u00fdmito dvoma svetmi, ktor\u00e9 si nemusia by\u0165 v\u017edy a\u017e tak bl\u00edzke a niekedy ve\u013ek\u00e1 pom\u00f4cka pre program\u00e1torov, ktor\u00ed maj\u00fa zrazu datab\u00e1zov\u00e9 \u00fadaje v kolekci\u00e1ch objektov. Aj preto JavaEE neostala tejto t\u00e9me ve\u013ea dl\u017en\u00e1 a obsahuje \u0161pecifik\u00e1ciu s n\u00e1zvom Java Persistent API (alebo JPA), ktor\u00e1 popisuje implement\u00e1ciu tak\u00e9ho mapovania.<!--more--><!--break--><\/p>\n<p>Ak ste sa niekedy dostali prv\u00fdkr\u00e1t k ORM mapovaniu, mohlo v\u00e1m to pripada\u0165 celkom jednoduch\u00e9. V datab\u00e1ze je tabu\u013eka, ktor\u00e1 ma napr\u00edklad p\u00e4\u0165 st\u013apcov. V k\u00f3de m\u00e1m zadefinovan\u00fd objekt, ktor\u00fd m\u00e1 p\u00e4\u0165 vlastnost\u00ed (vn\u00fatorn\u00fdch premenn\u00fdch) a ORM vrstva sa postar\u00e1, aby ste \u00fadaje z tej tabu\u013eky dostali do objektu. A to by mohlo by\u0165 v\u0161etko, ale nie je. Ur\u010dite nie v pr\u00edpade JPA. ORM je v tejto \u0161pecifik\u00e1cii \u017eiv\u00e1 vrstva va\u0161ej aplik\u00e1cie, ktorej schopnos\u0165 robi\u0165 toto mapovanie je hlavnou, ale nie jedinou funkciou. Po\u010fme ale pekne po poriadku, najprv \u00fapln\u00e9 z\u00e1klady<\/p>\n<p><span style=\"background: transparent;\">V\u0161etko je to tom<\/span><span style=\"background: transparent;\">, ako som nap\u00edsal vy\u0161\u0161ie, <\/span><span style=\"background: transparent;\">\u017ee <\/span><span style=\"background: transparent;\">potrebujete tabu\u013eku a potrebujete triedu<\/span>. Trieda je tzv. <em>POJO<\/em> (Plain Old Java Object), \u010do znamen\u00e1, \u017ee nemus\u00ed implementova\u0165 nejak\u00e9 rozhranie alebo by\u0165 odvoden\u00e1 od inej, \u0161peci\u00e1lnej triedy z JPA. St\u00e1le ale nejako potrebujete poveda\u0165, ako bude prebieha\u0165 mapovanie a na to m\u00e1te dve mo\u017enosti: <em>anot\u00e1cie<\/em> alebo <em>xml s\u00fabor<\/em>. Anot\u00e1cie umiestnite priamo do triedy \u2013 napr\u00edklad anot\u00e1ciu <em>@Entity<\/em> pou\u017eijete na triedu a v nej uvediete n\u00e1zov tabu\u013eky, na ktor\u00fa bude trieda mapovan\u00e1. Potom aj k jednotliv\u00fdm vlastnostiam triedy viete doplni\u0165 anot\u00e1cie, aby bolo jasn\u00e9, na ktor\u00fd st\u013apec v datab\u00e1ze sa dan\u00e1 vlastnos\u0165 mapuje. Tieto druh\u00e9 anot\u00e1cie u\u017e ale nie s\u00fa povinn\u00e9 a m\u00f4\u017eete ich vynecha\u0165, ak sa n\u00e1zov vlastnosti zhoduje s n\u00e1zvom st\u013apca. Xml s\u00fabor m\u00f4\u017ee by\u0165, ako aj in\u00e9 JavaEE descriptory, pribalen\u00fd v spr\u00e1vnom prie\u010dinku v <em>.war<\/em> alebo <em>.ear<\/em> s\u00fabore. A popisuje to ist\u00e9, ale svoj\u00edm \u2013 xml \u2013 \u0161t\u00fdlom. Treba poveda\u0165, \u017ee XML m\u00e1 vy\u0161\u0161iu prioritu ako anot\u00e1cie, teda ak s\u00fa zadefinovan\u00e9 obe, a protire\u010dia si, tak sa pou\u017eije to, \u010do je v XML s\u00fabore. Je to preto, aby \u010dlovek, ktor\u00fd sa star\u00e1 o deployment, a je si vedom\u00fd produk\u010dn\u00e9ho prostredia, do ktor\u00e9ho aplik\u00e1cia ide, bol schopn\u00fd niektor\u00e9 veci ovplyvni\u0165.<\/p>\n<p>Ak sa bav\u00edme o JPA, treba si uvedomi\u0165, \u017ee tu hovor\u00edme hlavne o vrstve objektov\u00e9ho modelu, ktor\u00fd sa mapuje na datab\u00e1zu a naopak. A treba doda\u0165, \u017ee to mapovanie medzi datab\u00e1zou a t\u00fdmto modelom v\u00f4bec nemus\u00ed by\u0165 jedna k jednej, ako som pop\u00edsal vy\u0161\u0161ie, ale m\u00f4\u017eu by\u0165 medzi nimi aj ve\u013ek\u00e9 rozdiely, ktor\u00e9 je ale JPA schopn\u00e9 prekona\u0165 r\u00f4znymi n\u00e1strojmi, ktor\u00fdmi m\u00e1 (napr\u00edklad mapovanie viacer\u00fdch objektov na jednu tabu\u013eku alebo naopak). Teda nepracujete tu (alebo presnej\u0161ie povedan\u00e9 nemus\u00edte pracova\u0165) s obrazom datab\u00e1zy v pam\u00e4ti, ale s vlastn\u00fdm objektov\u00fdm modelom, ktor\u00fd sa aj viac riadi mo\u017enos\u0165ami objektov (napr\u00edklad dedenie, ktor\u00e9 v svete rela\u010dn\u00fdch datab\u00e1z neexistuje). Druh\u00fa vec, ktor\u00fa si mus\u00edte uvedomi\u0165, \u017ee<span style=\"background: transparent;\"> JPA nie je m<\/span><span style=\"background: transparent;\">\u0155<\/span><span style=\"background: transparent;\">tva vrstva<\/span>, ktor\u00e1 len raz za \u010das presype \u00fadaje z pam\u00e4ti do datab\u00e1zy ale naopak. Je to naopak, celkom \u017eiv\u00e1 vrstva, ktor\u00e1 spolupracuje so svoj\u00edm okol\u00edm a v ktorej maj\u00fa napr\u00edklad objekty svoj vlastn\u00fd \u017eivotn\u00fd cyklus.<\/p>\n<p>Tak v prvom rade sa pri mapovan\u00ed v pam\u00e4ti vytvor\u00ed tzv. <em>persisten<\/em><em>t<\/em><em> context<\/em>. To je nie\u010do, ako miesto v pam\u00e4ti, do ktor\u00e9ho sa na\u010d\u00edtavaj\u00fa jednotliv\u00e9 objekty z datab\u00e1zy (resp. sa do neho dostan\u00fa nov\u00e9 objekty, pred t\u00fdm ne\u017e sa datab\u00e1zy ulo\u017eia). Aby sa nie\u010do tak\u00e9 vytvorilo, je potrebn\u00e9 ma\u0165 zadefinovan\u00e9 <em>persistence unit,<\/em> \u010do je XML s\u00fabor popisuj\u00faci pripojenie na datab\u00e1zu a tie\u017e definuje, kde v bal\u00edku sa nach\u00e1dzaj\u00fa s\u00fabory s triedami ent\u00edt (len dod\u00e1m, \u017ee je to in\u00fd XML s\u00fabor ako ten s mapovan\u00edm, ktor\u00fd som spom\u00ednal vy\u0161\u0161ie). Tento persistent context funguje tak trochu magicky, preto\u017ee napr\u00edklad objekt, ktor\u00fd je v \u0148om na\u010d\u00edtan\u00fd, sta\u010d\u00ed modifikova\u0165 a bez nejak\u00fd \u010fal\u0161\u00edch pr\u00edkazov sa zmena sama automaticky ulo\u017e\u00ed do datab\u00e1zy. V\u0161etky objekty, ktor\u00e9 maj\u00fa by\u0165 pridan\u00e9 do datab\u00e1zy musia by\u0165 najprv pridan\u00e9 do tohto persistent contextu a a\u017e odtia\u013e potom do datab\u00e1zy, at\u010f. API na manipul\u00e1ciu s objektami a tie\u017e s persistent contextom predstavuje trieda <em>EntityManager<\/em>, ktorej in\u0161tancia sa z\u00edskava pr\u00e1ve pre nejak\u00fa konkr\u00e9tnu persistent unit.<\/p>\n<p>JPA je (ako to b\u00fdva u JavaEE \u0161pecifik\u00e1ci\u00ed zvykom) ur\u010dit\u00fdm sp\u00f4sobom prepojen\u00e1 s ostatn\u00fdmi \u0161pecifik\u00e1ciami. A tak sa napr\u00edklad persistent context m\u00f4\u017ee spr\u00e1va\u0165 inak, pod\u013ea toho \u010di je EntityManager pou\u017e\u00edvan\u00fd v Stateless alebo Statefull EJB. Alebo je prepojen\u00fd na JTA a t\u00e1 synchroniz\u00e1cia s datab\u00e1zou prebieha pri commite transakcie. V skuto\u010dnosti exituje viacero variant, ako sa persistent context m\u00f4\u017ee spr\u00e1va\u0165 (dan\u00e9 prostred\u00edm, do ktor\u00e9ho je nasaden\u00fd alebo priamo nejak\u00fdm pr\u00edkazom API). Na za\u010diatku je ale ve\u013emi pravdepodobn\u00e9, \u017ee v\u00e1m bud\u00fa vyhovova\u0165 default nastavenia.<\/p>\n<p>Pre rela\u010dn\u00e9 datab\u00e1zy je prvorad\u00fdm jazykom \u0161tandard SQL. Pre JPA to tak nie je, aj ke\u010f z mo\u017enost\u00ed, ako robi\u0165 dotazy, zah\u0155\u0148a aj SQL. Tu s\u00fa v\u0161etky sp\u00f4soby, ako viete dotazova\u0165 (a hromadne aktualizova\u0165) objekty:<\/p>\n<p>1. JPQL \u2013 Java Persistent Query Language \u2013 nie\u010do ako SQL, ale dotaz sa nedeje nad rela\u010dnou datab\u00e1zou ale nad objektov\u00fdm modelom<\/p>\n<p>2. Weak Typed Criteria API \u2013 dotaz sa vytvor\u00ed komplet cez objektov\u00e9 API, kde vytv\u00e1ran\u00edm objektov a volan\u00edm met\u00f3d postupne zadefinujete v\u0161etky \u010dasti dotazu. Weak Typed preto, lebo sa nijako nerozpozn\u00e1vaju ani nekontroluj\u00fa typy st\u013apcov a hodn\u00f4t v podmienkach a pod.<\/p>\n<p>3. Strong Types Criteria API \u2013 dotaz sa podobne ako v predch\u00e1dzaj\u00facom pr\u00edpade vysklad\u00e1va \u010diste procedur\u00e1lnou cestou, ale tentokr\u00e1t sa to deje tak, \u017ee sa kontroluj\u00fa aj jednotliv\u00e9 typy \u00fadajov, ktor\u00e9 sa v dotaze pou\u017e\u00edvaj\u00fa.<\/p>\n<p>4. Named Queries \u2013 ako n\u00e1zov napoved\u00e1, ide o dotazy, ktor\u00e9 s\u00fa pomenovan\u00e9. Tieto dotazy s\u00fa v\u00e4\u010d\u0161inou definovan\u00e9 priamo v entite a s\u00fa bu\u010f nap\u00edsan\u00e9 v JPQL alebo v SQL. Pomocou ich mena je mo\u017en\u00e9 ich vola\u0165 a tak z\u00edska\u0165 v\u00fdsledok.<\/p>\n<p>To v\u0161etko je len stru\u010dn\u00fd preh\u013ead a ani ten nie je \u00fapln\u00fd. JPA obsahuje \u010fal\u0161ie t\u00e9my, ako s\u00fa napr\u00edklad <em>lifecycle events<\/em> (je mo\u017en\u00e9 zadefinova\u0165 met\u00f3dy, ktor\u00e9 s\u00fa volan\u00e9 pri ur\u010dit\u00fdch udalostiach, ktor\u00e9 sa dej\u00fa s Entitou), valid\u00e1ciu (prepojenie na <em>javax.validation<\/em>), caching, locking alebo rie\u0161enie konkuren\u010dn\u00e9ho pr\u00edstupu. \u010ealej obsahuje mo\u017enosti a nastavenie pre <em>Lazy<\/em> na\u010d\u00edtanie \u00fadajov (predstavte si, \u017ee sa Entita vy\u010d\u00edta z datab\u00e1zy, ale niektor\u00e1 jej vlastnos\u0165 sa re\u00e1lne na\u010d\u00edta do pam\u00e4te a\u017e ke\u010f je prv\u00fdkr\u00e1t vy\u017eiadan\u00e1) alebo generovanie sch\u00e9my datab\u00e1zy na z\u00e1klade objektov\u00e9ho modelu.<\/p>\n<p>O tom, \u017ee JPA nie je mal\u00e1 t\u00e9ma, sved\u010d\u00ed aj to, \u017ee sa o \u0148om d\u00e1 nap\u00edsa\u0165 497-stranov\u00e1 kniha a to konkr\u00e9tne <a href=\"http:\/\/www.bookdepository.com\/Pro-JPA-2-Mike-Keith\/9781430249269\">Pro JPA 2<\/a> od Mika Keitha a Merricka Schincariola. Tento k\u00fasok sa mi dostal do r\u00fak a v\u010faka nemu som zistil, \u017ee JPA nie je len jednoduch\u00fd automat, ktor\u00fd v\u00e1m vie d\u00e1ta z datab\u00e1zy prenies\u0165 do objektovej \u0161trukt\u00fary v pam\u00e4ti a naopak. Knihu v\u00e1m odpor\u00fa\u010dam, ak u\u017e viete programova\u0165 v Jave a viete aspo\u0148 zhruba, \u010do to JavaEE je, a aj v pr\u00edpade, \u017ee u\u017e m\u00e1te nejak\u00e9 sk\u00fasenosti s JPA. Ak ste s n\u00edm nerobili ve\u013emi ob\u0161\u00edrne na r\u00f4znych projektoch, je ve\u013emi pravdepodobn\u00e9, \u017ee m\u00e1 svoje z\u00e1kutia, o ktor\u00fdch ani neviete. Autori zvolili komplexn\u00fd pr\u00edstup, a tak sa za\u010d\u00edna dokonca \u013eah\u0161\u00edm vysvetl\u00edm, \u010di je Enterprise aplik\u00e1cia, n\u00e1sledne \u010do je to ORM a potom u\u017e jedna t\u00e9ma za druhou od t\u00fdch jednoduch\u0161\u00edch ako je oby\u010dajn\u00e9 oanotovanie triedy entity a\u017e po veci ako s\u00fa entitn\u00e9 grafy (\u010do je pomerne zlo\u017eit\u00fd sp\u00f4sob, ako mapova\u0165 r\u00f4zne objetkov\u00e9 modely s r\u00f4znou po\u017eiadavkou na Lazy\/Eager dostupnos\u0165 \u00fadajov na t\u00fa ist\u00fa rela\u010dn\u00fa \u0161trukt\u00faru \u2013 t\u00e9ma, ktor\u00e1 by si zasl\u00fa\u017eila \u010dl\u00e1nok s\u00e1m o sebe). Preto, ak sa chcete dozvedie\u0165, \u010do to JPA je, alebo aj v pr\u00edpade, \u017ee u\u017e anotujete entity, ale chcete vedie\u0165 \u010do sa e\u0161te viac d\u00e1 s JPA robi\u0165, v\u00e1m knihu odpor\u00fa\u010dam.<\/p>","protected":false},"excerpt":{"rendered":"<p>ORM je skratka v\u00fdrazu Object-Relation Mapping, \u010do je princ\u00edp toho, \u017ee sa \u00fadaje ulo\u017een\u00e9 v rela\u010dnej datab\u00e1ze namapuj\u00fa na objekty v pam\u00e4ti alebo naopak. Je to \u010dasto d\u00f4le\u017eit\u00fd premos\u0165ovac\u00ed prvok medzi t\u00fdmito dvoma svetmi, ktor\u00e9 si nemusia by\u0165 v\u017edy a\u017e tak bl\u00edzke a niekedy ve\u013ek\u00e1 pom\u00f4cka pre program\u00e1torov, ktor\u00ed maj\u00fa zrazu datab\u00e1zov\u00e9 \u00fadaje v kolekci\u00e1ch [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-83","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=83"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":150,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/83\/revisions\/150"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}