Čas:23.3.2007 18:43:15
Od:finc
Předmět:Super
Super podcast na téma, které se zrovna dost učím :) Osobně jsem na JPA postavil jednu desktop aplikaci, která už je v plném běhu a musím říct, že snadnost, jakou se dají mapovat objekty na relační tabulky je vážně skvělá. Byl zmíněn OQL jazyk, který sice je dobrým pomocníkem, ale pokud člověk byl zvyklý psát klasické SQL příkazy, občas to trošku skřípe. U složitějších dotazů mi vadí ta nemožnost smysluplně tvořit where podmínky, které jsou právě v Hibernate. Když to vezmu na příkladu, tak např v OQL nevím, jak bych napsal např toto: SELECT SQL_CALC_FOUND_ROWS a.id_cislo, CONCAT(a.prijmeni, ' ', a.jmeno, ' (', a.id_cislo, ')') AS zamestnanec, b.plan, b.dochazka, b.potvrzeni, c.kod_lokalita AS lokalita, c.kod_provoz AS provoz, d.nazev AS pracoviste, h.planovani AS prava_planovani, IF(c.kod_lokalita = 'KH', '0', h.dochazka) AS prava_dochazka, IF(h.potvrzeni IS NULL, '0', '1') AS prava_potvrzeni FROM zamestnanci AS a LEFT JOIN (SELECT a.zamestnanec, SUM(b.odpracovano) AS plan, SUM(a.dochazka) AS dochazka, SUM(a.potvrzeni) AS potvrzeni FROM personalistika_dochazka AS a LEFT JOIN personalistika_dochazka_smeny AS b ON a.plan_smena = b.id WHERE ". $this->getWhereDochazka() ." GROUP BY a.zamestnanec) AS b ON a.id_cislo = b.zamestnanec INNER JOIN strediska_detail AS c ON a.cislo_strediska = c.cislo_strediska INNER JOIN strediska_pracoviste AS d ON c.id_pracoviste = d.id INNER JOIN personalistika_dochazka_prava_nadrizeny AS h ON h.nadrizeny = a.nadrizeny AND h.uzivatel = '". Models_User::id() ."' WHERE 1 = 1 ". $this->getWhere() ." ORDER BY a.prijmeni, a.jmeno :)) Vím, že existuje native query, ale raději bych použil OQL, problém však nastává ve chvíli složitějších dotazů. Osobně na toto téma jsem nenašel ani moc informací na webu. Vždy se jedná jen o maličké tutoriály. Největší problém vidím právě při výkonosti. A co EJB3, bude toto téma bráno v potaz? :)
Čas:23.3.2007 18:52:42
Od:Lukas Barton
Předmět:Re: Super
Slozitejsi HQL samozrejme psat lze :-) Typicka je konstrukce select new MujSpecialniValueObject(....) from .... nebo bez toho value Objectu, kdyz z query lezou stejne typy, ktere jsou definovane v mapovani.
Jako vetsi nedostatek vidim, ze vubec nefunguje slozitejsi DML .
Čas:23.3.2007 19:13:54
Od:finc
Předmět:Re: Re: Super
Na to existují v EntityManageru metody (persist, merge, ...). Zde bych problém neviděl. Navíc si můžu napsat pořád native query.
Čas:23.3.2007 20:19:56
Od:Dagi
Předmět:Re: Super
U ORM vzdy zalezi na mapovani, takze vyselektujete pouze to co vam dovoli mapovani, ani o pid vice. Jako reseni pro slozitejsi dotazy jako tento, bych opravdu volil stare dobre SQL. V pripade HQL (Hibernate QL) bych pro dotazy nevahal pouzit rovnez Criteria API http://www.hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html
Čas:24.3.2007 9:51:55
Od:finc
Předmět:Re: Re: Super
Problém v té chvíli ale je, že výsledek nelze načíst do List<entita> ale musím si tvořit nějaké vlastní DTO a to znamená, že jsem tam, kde jsem byl :) Navíc si moc neumím představit, jak by vypadaly např. takové pivotní tabulky (tzn. převod řádků do sloupců). Když dám příklad, mám sloupce "uzivatel, datum" a já chci výsledek jako uživatel a sloupce budou po měsících. V SQL to není problém napsat, ale výsledek do objektu si už moc představit neumím :( Jinak co se týče toho XML vs. Anotace, tak jste nezmínili výhodu anotací :) Vše mám na jednom místě a ve chvíli, když něco měním, měním to jenom tam, nemusím už hledat XML soubor :) Přijde mi, že je to zvlášť výhodné pro velké projekty, kdy se stejně programátor zvrhne k tomu mrskat jen @Entity s anotacemi, je to řádově o dost rychlejší. Ale jak už zmíněno, asi je to na každém, co si zvolí,když obě cesty jsou správné.
Čas:24.3.2007 9:54:21
Od:finc
Předmět:Re: Re: Re: Super
Kurnik, mělo tam být List'Entita' :(
Čas:26.3.2007 9:50:28
Od:Lukas Barton
Předmět:Re: Re: Re: Super
V HQL to samozrejme udelate, pouzijte group by month(mapovana.entita). A taky vam z toho vypadne List. Jen si pro tu tabulku musite udelat value object - teda pokud vam nestaci List obsahujici Object[]. (ve vasem pripade asi String a Number).
Čas:26.3.2007 10:42:37
Od:benzin
Předmět:Proc se svazujete s View?
Muzu se zeptat, proc pri ORM resite View vrstvu? Vzdyt je to o dve vrstvy dal? Preci programuju busines logiku a pak nejake View, jednoho krasneho dne treba RCP. Vlastne vsechno se da bez potizi Proxovat, takze vsude kde je lazy reading, neni problem proxovat, otevrit session a pak zase zavrit. Spring to resi bez potizi pres AOP. A vse se da udelat automaticky v ramci frameworku (proto mame reflection). Napriklad kdyz pouzivate RMI a spojujete klieta se serverem, tak mate obdobny problem jako pri Webu, ale tam samozrejme zadny vzor open before view, neni implementovany. Takze tam se jednoduse pouziva AOP, a neni zadny problem. Navic na takto vytvorenou aplikaci muzete pripojit klidne webovou prezentacni vrstu, stejne tak jako jakoukoli jinou, treba nejakeho robota. No a samozrejme musim pripojit commandy, takove ktere pak vyvolavaji ulozeni objektu. Ale i tyhle commandy se daji pripojit automaticky pomoci proxy.
Čas:26.3.2007 11:20:03
Od:Lukas Barton
Předmět:Re: Proc se svazujete s View?
No protoze kdyz udelas business vrstvu bez znalosti toho, jake view nad tim bude, tak se snadno dostanes do problemu s vykonem.
Business vrstva musi taky vypadat jinak, kdyz se pouziva pres RMI, Web services nebo lokalne v ramci jednoho aplikacniho serveru. (eg. coarse grained vs. fine grained API).
Čas:26.3.2007 12:02:26
Od:benzin
Předmět:Re: Re: Proc se svazujete s View?
Muzete uvest nejaky priklad? Mne fakt nic nenapada. Moc nechapu proc by se mely objekty tvorit a zanikat z HTTP dotazem. Resp. proc by je melo zajimat, co za klienta user pouziva.
Čas:26.3.2007 12:15:39
Od:Lukas Barton
Předmět:Re: Re: Re: Proc se svazujete s View?
Nevedel jsem, ze narazite na "vzory" jako Open Session in View.
Ten je IMHO dobry jen pro jednodussi webove aplikace. Pokud chcete stejne API pouzit napr. v RCP muzete se lehce do problemu.
Otazkou je, jestli je chyba skoncit se tremi "ruznymi" API - pro web, pro RCP a pro batch processing?
Čas:6.6.2008 20:16:12
Od:pefo
Předmět:Re: Re: Proc se svazujete s View?
Hmm, chcem priklad, ale nemyslim si ze by ten business mal byt az tak naviazany na view vrstvu... web services a rmi tam rozidel musi byt (kvoli sevurity) ale co sa tyka samotnej business funkcnosti , tak ziadny ... priklad by pomohol ..
Čas:26.3.2007 13:11:51
Od:Roman "Dagi" Pichlík
Předmět:Re: Proc se svazujete s View?
To neni o svazovani s view vtstvou, jedna se o jekohokoliv jineho klienta. V podcastu jsme to zminili z toho duvodu, ze je to casty problem, ktery se resi pres vsechny aplikace postavene nad ORM. Zaroven bylo zmineno, ze existuji dva pristupy: open session in view a DTO. Oba dva jdou implementovat bez ohledu typu klienta.
Čas:26.3.2007 13:22:05
Od:Lukas Barton
Předmět:Re: Re: Proc se svazujete s View?
To nevim jak udelas Open Session in View nad Hibernatem - jakakoliv vyjimka nad session totiz zpusobi, ze uz je pro dalsi praci neouzitelna a je nutne ji zahodit a otevrit novou.
To se presne hodi na webove aplikace, kde nemusi byt nutne se umet zotavit z vyjimky na nizsi urovni.
Čas:26.3.2007 15:16:26
Od:finc
Předmět:Re: Proc se svazujete s View?
Také si nemyslím, že by to bylo svazování s view vrstvou. Dokáži si tak nějak udělat v tomto rozdíl :) Ale když si vezmu, že budu dělat složité dotazy nad miliony, tak musím hodně koukat na výkon. Téměř každá DB má raději větší dotaz než několik malých. Jinak řečeno, když budu potřebovat sumy, atd. tak se stejně musím zajímat o to, jak bude view vlastně vypadat, už když píši business logiku. Osobně mi spíše šlo o to, kam až v ORM mohu zajít. Ony tutoriály jsou sice krásné, ale view většinou vypadá tak, že se jedná o nějakou pivotní či jinou tabulku, která už není tak jednoduchá jako v případě SELECT * FROM table.
Čas:29.3.2007 17:19:47
Od:benzin
Předmět:Re: Re: Proc se svazujete s View?
No jenze tohle je otazou pohledu. Podle mne by programatorovi view melo byt jedno jak vypada vevnitr busines objekty, stejne tak jako je jedno programatorovi busines objektu jak vypada vevnitr persistentni vrstva. Hibernate je ORM nastroj, ale nestoji na teto urovni sam, bez uprav a nadstaveb proste neni kompletni. ORM pak resi treba pristup k sumacnim obektum, jsou-li treba. Takze zakaznik da pozadavek, programator busines vrstvy na nej reaguje (nejedna-li se jenom o zmenu view) a na popud programatora busines vrstvy vynikne pozadavek na dotvoreni presistentni vrstvy (je-li to treba). Proto si myslim, ze ani busines vrstva, ani view vrstva by nemala zasahovat do toho jak si persistentni vrstva resi session, kdy ho zavira a kdy otevira. A je uplne jedno jak ma vypadat vysledna UI tabulka, z kolikati objektu je posladana.
Čas:30.3.2007 20:55:42
Od:milos
Předmět:Prima, ze je popis struktury a obsahu
To je prima, ze je tu obsah a dokonce se strukturou. To postradam na AVC - alespon kratky popis. Tam jsem napr. stahl video Co by mel programator znat a bylo to jako na zive.cz - jednalo se jen o MS NET. Takze jsem byl zklamany. A stahnout 200 M jeste neni vsude brnkacka. dik.
Čas:7.4.2007 11:07:09
Od:Honza
Předmět:Dobry podcast
Uz se tesim na dalsi podcast. O hibernate jsem toho vedel dost, ale bylo pro me nove to co se tyce JPA, takze to hodnotim fakt SUPER. Za hodku a pul dobreho poslouchani se clovek dozvi spoustu zajimavosti. Takze pro vsechny: jen tak dal :-)
Diskuzní příspěvky
finc Super
Lukas Barton   Re: Super
finc   Re: Re: Super
Dagi   Re: Super
finc   Re: Re: Super
finc   Re: Re: Re: Super
Lukas Barton   Re: Re: Re: Super
benzin Proc se svazujete s View?
Lukas Barton   Re: Proc se svazujete s View?
benzin   Re: Re: Proc se svazujete s View?
Lukas Barton   Re: Re: Re: Proc se svazujete s View?
pefo   Re: Re: Proc se svazujete s View?
Roman "Dagi" ...   Re: Proc se svazujete s View?
Lukas Barton   Re: Re: Proc se svazujete s View?
finc   Re: Proc se svazujete s View?
benzin   Re: Re: Proc se svazujete s View?
milos Prima, ze je popis struktury a obsahu
Honza Dobry podcast