Alternativa k Hibernate

anonym

Re:Alternativa k Hibernate
« Odpověď #30 kdy: 28. 07. 2018, 21:51:42 »
Tiez sa priklanam vynechat ORM. Zdoraznil by som ale pristup k databaze cez Declarative interface (napr  v jdbi).
V principe si spravis cisty interface, a ten potom pomocou sql dotazov implementujes. napr:

public interface ZmluvyDao{
 List<Zmluva> zoznamZmluv(String customerId);
 Zmluva zmluvaPodlaId(String cisloZmluvy);
 long vytvorZmluvu(Zmluva);
}

potom uz len pises sql dotazy k jednotlivym metodam
ZmluvyDao.zoznamZmluv:
sleect * from zmluvy where customerId=:customerId order by cisloZmluvy;
atd.

Ak sa dobre pozries na interface, pripomina API k nejakemu inemu systemu, ako by si databazu volal cez pripravene REST rozhranie. Takto vies aplikaciu oddelit od problematiky databazy. Proste si napises API ake potrebujes a potom si ho implementujes (napises sql ktore ho zrealizuju v db).

taketo rozdelenie vies potom vyuzit vo viacerych smeroch:

1. sql je netypovy jazyk bez moznosti validacie pri kompilovani aplikacie. Preto je absolutne nutne robit unit testy aby nahradili kompilacnu typovu validaciu. Pri takomto rozdeleni je to jednoduche. Vytvoris databazu (napr h2 v pamati),
spustis int scripty (napr. Flyway) a zacnes volat jednotilive methody interface. Takto si schopny otestovat celu databazu bez toho aby si sa prekusaval business logikou aplikacie ktora ju pouziva. Vies jednoducho skontrolovat ze si otestoval 100% volani db.

2. ak mas nad db vrstvou zlozitejsiu business logiku, vies specificke unit testy robit bez nutnosti vytvarania db, lebo db interface sa da lahko namokovat.

3. cirou nahodou si prave naplnil principy "hexagonal architecture"

4. neboj sa robit ine data objekty na citanie a ine na zapisovanie, ak to potrebujes. Vyhoda je ze vies priamo z databazy vytahovat DTO z public rozhrani aplikacie a nemusis ich premapovavat ako sa to bezne robi s hibernate. Ako pristupit k rozdielom pri zapise a cistani pozri napr na CQRS ktore to detailnejsie rozobera https://martinfowler.com/bliki/CQRS.html

Pointu interfacu jsem zati moc nepochytil, kde jsem je na projektu měl tak byly úplně na hovno, jenom takový maras přes který se musíš v kódu proklikávat. Přijde mi to zbytečné a byrokratické.


anonym

Re:Alternativa k Hibernate
« Odpověď #31 kdy: 28. 07. 2018, 21:53:27 »
Jak zminujes to Mockovani, tak interface se sice da namockovat, to jo, ale to stejne tak muzes udelat reflexi. Ja jak moc reflexi nemusim, tak na testovani to je jedno.

Re:Alternativa k Hibernate
« Odpověď #32 kdy: 28. 07. 2018, 22:13:10 »
Pointu interfacu jsem zati moc nepochytil, kde jsem je na projektu měl tak byly úplně na hovno, jenom takový maras přes který se musíš v kódu proklikávat. Přijde mi to zbytečné a byrokratické.

Pointa interfaců je ta, máš jeden interface a více možných implementací. Místo ArrayList používáš všude interface List. To rozhodně není zbytečné, protože to umožňuje pracovat s objektem, aniž bych znal jeho přesný typ. Spíš naopak, chtělo by to je ještě rozšířit, protože třeba jsou pořád možnosti interfaců tak trochu nedomrlé.

anonym

Re:Alternativa k Hibernate
« Odpověď #33 kdy: 28. 07. 2018, 22:38:43 »
Pointu interfacu jsem zati moc nepochytil, kde jsem je na projektu měl tak byly úplně na hovno, jenom takový maras přes který se musíš v kódu proklikávat. Přijde mi to zbytečné a byrokratické.

Pointa interfaců je ta, máš jeden interface a více možných implementací. Místo ArrayList používáš všude interface List. To rozhodně není zbytečné, protože to umožňuje pracovat s objektem, aniž bych znal jeho přesný typ. Spíš naopak, chtělo by to je ještě rozšířit, protože třeba jsou pořád možnosti interfaců tak trochu nedomrlé.

No tak tam je to jasné, ale dělat na každé DAO nebo Service Interface je prostě nanic. K čemu ti to je, nikdy nebudeš mít vícero implementací jedné beany. A pokud ano, tak tomu uděláš ten interface, ale to je minorita případů. Naco dávat automaticky ke každému DAO interface... Navíc předělat současnou třídu na interface můžeš vždy.

Peter

Re:Alternativa k Hibernate
« Odpověď #34 kdy: 28. 07. 2018, 22:47:58 »
Pointa interface v tom DAO je ze nepises implementaciu. Tu spravi reflection z toho interface a sql suboru.


anonym

Re:Alternativa k Hibernate
« Odpověď #35 kdy: 28. 07. 2018, 23:32:37 »
Pointa interface v tom DAO je ze nepises implementaciu. Tu spravi reflection z toho interface a sql suboru.

Jo já už vím co myslíš, to umí MyBatis. Jenže zase je tam zatím nějaký magic přes reflexi co ti musí nastartovat když spouštíš aplikaci. To prostě nechci, nad tím je postavený celý Spring. A na ten jsem se vykaslal protoze je to magic a má bugy. Jak tam jednou začněš dělat takový magic, tak v jakém bodě skončíš? (U SPring Data JPA, otřesná věc)

anonym

Re:Alternativa k Hibernate
« Odpověď #36 kdy: 28. 07. 2018, 23:44:48 »
Takhle vypadá můj Rest, není to žádná sláva, ale když to setřídím podle abecedy a odsadím, dá se v tom vyznat.

Kód: [Vybrat]
            if ((p = matches(req,            "/keyword",         "GET")) != null) {
                rslt = dataService.findAllKeywords();
            }

            else if ((p = matches(req,      "/keyword/{id}",    "GET")) != null) {
                rslt = dataService.findKeyword(p.get(0));
            }

            else if ((p = matches(req,      "/logout",          "GET")) != null) {
                boolean success = loginService.logout(req);
                rslt = "Logout was " + (success ? "successful" : "unsuccessful.");
            }
           
            else if ((p = matches(req,      "/login/{user}/{password}",       "GET")) != null) {
                rslt = loginService.login(req, p.get(0), p.get(1));
            }

            else if ((p = matches(req,      "/secretsection",   "GET")) != null && loginService.isLoged(req)) {
                rslt = "You are in the secret section!";
            }

            if ((p = matches(req,           "/timeline",        "GET")) != null) {
                rslt = dataService.findAllTimelines(connStatements);
            }

            else if ((p = matches(req,      "/info",            "GET")) != null ) {
                rslt = getRestMap();
            }

            else {
                pw.println("This URI is not connected to any service: '" + req.getPathInfo() + "' method: '" +
                req.getMethod() + "'");
            }


Re:Alternativa k Hibernate
« Odpověď #37 kdy: 29. 07. 2018, 08:53:28 »
A na ten jsem se vykaslal protoze je to magic a má bugy.
Jak jste se vedle ptal na ty výborné programátory, tak výborný programátor, pokud mu nějaká aplikace nebo knihovna připadá „magic“, tak se podívá do zdrojáků, pochopí, jak to funguje, a magie je pryč. A pokud narazí na chybu, tak ji opraví a pošle patch.

anonym

Re:Alternativa k Hibernate
« Odpověď #38 kdy: 29. 07. 2018, 09:46:51 »
A na ten jsem se vykaslal protoze je to magic a má bugy.
Jak jste se vedle ptal na ty výborné programátory, tak výborný programátor, pokud mu nějaká aplikace nebo knihovna připadá „magic“, tak se podívá do zdrojáků, pochopí, jak to funguje, a magie je pryč. A pokud narazí na chybu, tak ji opraví a pošle patch.

Jako že se budu proklikávat přes všechny ty Interfacy a Abstrakce ve Springu??????????????!!!!!!!!!!!!! Tak to vám upřímně říkám, že tak "dobrý programátor" nebudu nikdy, na to prostě nejsem zvědavý. Tam se nikdy neproklikáte jen k nějakému kusu kódu jako ve standardní JDK když se mrknu do HashMapy. U takových knihoven jako je Spring se nikdy nepodíváte na kousek něčeho co zrovna potřebujete!

Asi prostě hloupý programátor jako já potřebuje buďto jednoduchý framework, a nebo framework který prostě funguje na 100%. (A to je musí být opět jednoduchý framework, protože ty složite věci více méně nefungují vždy).

Moje ideální představa o opensource frameworku vypadá takhle:

Je to seznam výborných samostatných knihoven, které splňují "Dělá to jednu věc, a tu to dělá dobře". K tomu frameworku je trocha example příkladů, které tvoří různá usecase. A je k tomu manuál, který nepopisuje složitě udělaný framework, ale popisuje, jak pomocí těch kostiček poskládat aplikaci. Něco jako je Arch linux. Tohle je pro mě ideální framework - protože to vlastně není úplně framework ve smyslu nějakého blackboxu, ale je to knowhow + knihovny a postupy.

A ten manual je udělaný ve smyslu rostoucí aplikace: dělám minimální konfiguraci toho, co vlastně potřebuju, a když chci něco přidat, dočtu se tam jak bych to měl přidat. Takže ne jako Spring, kde když chci Rest, Thymeleaf a login do své aplikace, tak mi 7 vteřin startuje půlka prasete.

Re:Alternativa k Hibernate
« Odpověď #39 kdy: 29. 07. 2018, 10:13:16 »
Jako že se budu proklikávat přes všechny ty Interfacy a Abstrakce ve Springu?
Jaký je rozdíl mezi rozhraním a abstraktní třídou a k čemu slouží se ptáme na pohovorech kandidátů na juniorskou pozici.

Mimochodem, kdybyste se někdy opravdu podíval na implementaci java.util.HashMap, nebo alespoň na její rozhraní, zjistil byste, že dědí od abstraktní třídy java.util.AbstractMap a implementuje rozhraní java.util.Map.

Tam se nikdy neproklikáte jen k nějakému kusu kódu jako ve standardní JDK když se mrknu do HashMapy. U takových knihoven jako je Spring se nikdy nepodíváte na kousek něčeho co zrovna potřebujete!
Mluvte za sebe. Věřím vám, že vy se na to nikdy nepodíváte. Já ano.

Asi prostě hloupý programátor jako já potřebuje buďto jednoduchý framework, a nebo framework který prostě funguje na 100%. (A to je musí být opět jednoduchý framework, protože ty složite věci více méně nefungují vždy).

Moje ideální představa o opensource frameworku vypadá takhle
Hloupý programátor nikdy nevymyslí dobrý framework. Takže byste měl hlavně zapomenout na vaše naivní představy a naučit se aspoň základně používat něco, co vymysleli lidé chytřejší než vy.

anonym

Re:Alternativa k Hibernate
« Odpověď #40 kdy: 29. 07. 2018, 10:39:46 »
Hloupý programátor nikdy nevymyslí dobrý framework. Takže byste měl hlavně zapomenout na vaše naivní představy a naučit se aspoň základně používat něco, co vymysleli lidé chytřejší než vy.

Ano, asi bych měl, asi bych měl prostě sklopit hlavu a zabít si po sobě několik víkendů jenom proto, že ve Springu je bug! Asi bych měl sklopil hlavu, říct si že jsem čurák a nechat si vysát všechen volný čas touhletou hydrou, které se inkrementuje verze z 2.0.2 na 2.0.3 a rázem je všechno jinak!

Vy prostě ústavičně děláte z lidí nějaké pitomce. To by dozadeke bylo, abyste uznal, že nějaký soft prostě stojí za hovno. U vás zřejmě soft je vždy ok a problém je vždy mezi židlí a klávesnicí. A takoví lidi, co se nasrali a vymysleli třeba Go nebo Python, protože viděli, jak je všechno nebetyčně přeinženýrované, tak to jsou u vás asi pitomci.

Tuhle se mnou třeba vyjebal v minulé práci Spring a AOP. Jednou za čas, když je zdupaný testovací enviroment neumožňující profilovat JVM,  člověk potřebuje zasrané AOP, aby si na balíčku mohl logovat časy spuštění metod. Celou dobu to AOP má a člověk tu jebku prostě nevyužije, protože normálně je úplně na hovno, ale ve zkurveném žumpen projektu nastane jednoho dne taková situaca. A výsledek? Ta jebka prostě nefunguje, protože ve Springu verze 3.5 je bug, že když aop narazaí na Vararg v metodě, tak to prostě vyhodí exception a sesype se to. Fuck off.

Lepší by bylo, kdyby tam žádné zkurvené AOP nebylo. To bych totiž nasázel do balíčku logování ručně do každé metody a měl bych to hotové dřív, než se dupat se zasraným Springem.

K čemu to je, že to má tolik featur, když to DPČ NEGUNGUJE POŘADNĚ!!! A to bych mohl pokračovat a pokračovat, kdy a jak se mnou ta jebka Spring vyjebala.

Teď v tom Spring Bootu udělali zase nějaký magic s embedded servlet kontejnerem, že jim to nastartuje za cca 7 vteřin. Náhodně mi tam při startu funguje a nefunguje jakásik Hibernatí závislost, prostě to vyhodí exception a čau. Při dalším startu to je zase ok. (obojí myslím kompletní restart, ne Devtools magic). Nevím čím to je. Možná Command Line Runnerem, že se někdy spustí dřív než se inicializovaly některé beany? Nebo možná je tam někde uvnitř v te jebce zase někde bug. Každopádně vím to, že to prostě nechci řešit, protože na to nemám čas. Vím, že bych na téhleté exception mohl klidně spálit 2 dny svého volného času.


Re:Alternativa k Hibernate
« Odpověď #41 kdy: 29. 07. 2018, 12:56:04 »
Vy prostě ústavičně děláte z lidí nějaké pitomce.
Nedělám. Děláte ho ze sebe vy sám, tím, co sem píšete.

U vás zřejmě soft je vždy ok a problém je vždy mezi židlí a klávesnicí.
Ale nevymlouvejte se. Já to netvrdím o všem a o všech, tvrdím to konkrétně o vás, na základě toho, co tady píšete.

K čemu to je, že to má tolik featur, když to DPČ NEGUNGUJE POŘADNĚ!!! A to bych mohl pokračovat a pokračovat, kdy a jak se mnou ta jebka Spring vyjebala.
Jasně, chyba je ve všem okolo, jenom vy jste dokonalý. Mimochodem, to jste narazil na další vlastnost výborných programátorů – nejprve hledají chybu u sebe a ve svém kódu, teprve pak u ostatních.

Teď v tom Spring Bootu udělali zase nějaký magic s embedded servlet kontejnerem, že jim to nastartuje za cca 7 vteřin.
Ne jim, ale vám. Ostatním to funguje správně.

Youda

Re:Alternativa k Hibernate
« Odpověď #42 kdy: 29. 07. 2018, 17:04:28 »
Pro inserty osobne pouzivam stored procedury,  mam pak navic jistotu, ze nikdo  neudela nic, co nechcu, sam si ridim transakce.

Jak zajišťují uložené procedury, že "nikdo  neudela nic, co nechcu"? Jaký mají uložené procedury vliv na transakce?

Samy o sobě nijak, ale obvykle se používají v souvislosti s tím, že máš v DB víc uživatelů, a ten, pod kterým tam chodí aplikace má jen omezená práva, není vlastníkem objektů a nemůže dělat INSERT, UPDATE atd. a může jen volat ty procedury + SELECTy na určitých tabulkách.

Co se týče transakcí, ty bych do procedur většinou nedával a řešil je vně – tak, aby si transakci mohl řídit ten, kdo to volá a nebylo to zadrátované v proceduře. Výjimkou je logování, které se dělá v autonomní transakci (zalogováno chci mít vše, i když se na konci udělá ROLLBACK a/nebo vyletí nějaká výjimka) a některé speciální případy.

Transakci v procedurach jsem mel namysli, ze PLSQL proceduru pouzivam jako uzavrenou transakcni jednotku, atomickou operaci, ktera bud komplet dobehne nebo rollbackne
V Java kodu mam pak pouze atomicke selecty (zabalene v lidsky citelnych views) a executy, vubec neresim transakce na hibernate urovni.

Pro slozitejsi veci je to mozna malo, ale pro vetsinu beznych zalezitosti tento pristup postacuje, reseni je krasne citelne, rychle a je odolne vuci chybam.
Defacto se snazim z celeho Hibernatu pouzivat jenom connection pool a bean mapper.

Re:Alternativa k Hibernate
« Odpověď #43 kdy: 29. 07. 2018, 17:37:57 »
Vy prostě ústavičně děláte z lidí nějaké pitomce.
Nedělám. Děláte ho ze sebe vy sám, tím, co sem píšete.

U vás zřejmě soft je vždy ok a problém je vždy mezi židlí a klávesnicí.
Ale nevymlouvejte se. Já to netvrdím o všem a o všech, tvrdím to konkrétně o vás, na základě toho, co tady píšete.

K čemu to je, že to má tolik featur, když to DPČ NEGUNGUJE POŘADNĚ!!! A to bych mohl pokračovat a pokračovat, kdy a jak se mnou ta jebka Spring vyjebala.
Jasně, chyba je ve všem okolo, jenom vy jste dokonalý. Mimochodem, to jste narazil na další vlastnost výborných programátorů – nejprve hledají chybu u sebe a ve svém kódu, teprve pak u ostatních.

Teď v tom Spring Bootu udělali zase nějaký magic s embedded servlet kontejnerem, že jim to nastartuje za cca 7 vteřin.
Ne jim, ale vám. Ostatním to funguje správně.

No ale on má částečně pravdu, overhead při práci s frameworkem může být docela velký, pokud ho člověk opravdu dobře neovládá. Chytrý a zkušený programátor ho sice lépe zvládne, ale to ještě neznamená, že je to ideální situace. Kdo z nás nestrávil x hodin kvůli nějaké chybě v nějaké knihovně?

Samotný Spring vznikl jako reakce na složitost EJB a chtěl být právě jednoduchý a přímočarý. Skutečnost, že už taky nabobtnal, jasně ukazuje, že zachovat jednoduchost u velkých projektů je prakticky nemožné. Což je ale zároveň argument, který by měl hlavu původního tazatele trochu ochladit. Protože na druhou stranu každý už asi zažil, že začal používat nadšeně nějaký odlehčený framework, ale po čase narazil na jeho omezení a zjistil, že musí spoustu věcí doprogramovat anebo použít něco masivnějšího.

Prostě hlavní dovednost pro chytrého i průměrného programátora je najít nástroj přiměřený danému úkolu. V daném případě by autor buď neměl použít Boot anebo by měl věnovat úsilí k jeho ovládnutí.

Re:Alternativa k Hibernate
« Odpověď #44 kdy: 29. 07. 2018, 18:17:05 »
No ale on má částečně pravdu, overhead při práci s frameworkem může být docela velký, pokud ho člověk opravdu dobře neovládá.
To je ovšem něco jiného, než co tvrdí anonym. Navíc on tady popisuje příklady, které mohl opsat z dokumentace, kdyby ji ráčil otevřít.

Samotný Spring vznikl jako reakce na složitost EJB a chtěl být právě jednoduchý a přímočarý. Skutečnost, že už taky nabobtnal, jasně ukazuje, že zachovat jednoduchost u velkých projektů je prakticky nemožné.
Spring sice nabobtnal, ale zároveň se používá snáz, než dřív. Což má ty negativní důsledky, že se ho snaží použít i lidé jako anonym.

Jinak Spring není žádná krása, když se podíváte dovnitř, je vidět, jaký je to slepenec všeho možného, co řešilo konkrétní problém, a teprve nad tím je to relativně slušné API. I když základní knihovna Javy na tom vlastně není o mnoho lépe. Ale jak v JDK tak ve Springu se v poslední době věnuje docela úsilí pročištění.

Prostě hlavní dovednost pro chytrého i průměrného programátora je najít nástroj přiměřený danému úkolu. V daném případě by autor buď neměl použít Boot anebo by měl věnovat úsilí k jeho ovládnutí.
Tady ani nebylo potřeba věnovat úsilí ovládnutí Springu, stačilo vybrat si ten správný z mnoha příkladů a upravit ho. Anonym se tu ptal na úplně základní věci, které jsou popsané krok za krokem v dokumentaci a jsou na to příklady.