Komentáře k článku
Doctrine 2:stavy entit a transakce

V rámci seriálu o Doctrine 2 dnes budeme pokračovat v tématech nakousnutých posledně. Podíváme se podrobněji na stavy entit v průběhu jejich života. Ukážeme si nejdůležitější fungování UnitOfWork i práci s transakcemi a zamykáním.
Re: Doctrine 2:stavy entit a transakce
Dobrý den, měl bych „dotaz“ k následující části:
„…občas to ale bohužel vede k vyloženě nešťastnému a nečekanému chování, se kterým je potřeba počítat.“
Nebyl by nějaký konkrétní příklad neočekávaného chování, na který jste při používání Doctrine2 UnitOfWork narazil?
Jinak díky za pěkný seriál. .)
Re: Doctrine 2:stavy entit a transakce
UnitOfWork neprovádí dotazy v takovém pořadí, v jakém přišly, ale přeskupuje si je podle svého uvážení. Což je na jednu stranu fajn, protože to má pozitivní vliv na výkon. Na druhou stranu ale občas může na pořadí záležet a pokud se přeskupí, dostane se úplně jiný výsledek. Například když udělám:
tak to samozřejmě dopadne úplně jinak, než když udělám:
Pak je potřeba počítat s tím, že Doctrine 2 provádí po zavolání
flush()
jednotlivé aktualizace v následujícím pořadi:Takže ať bych napsal výše uvedený příklad v jakémkoliv pořadí, vždycky se nakonec provede ve své první podobě, tabulka s články bude tedy nakonec zcela prázdná.
Pokud by to někomu v konkrétní situaci opravdu vadilo, nezbývá, než si manuálně otevřít transakci a provést v rámci ní více sad změn a každou vždy potvrdit pomocí samostatného
flush()
.Re: Doctrine 2:stavy entit a transakce
Díky za odpověď; myslel jsem, že mj. právě o správné pořadí dotazů by se měl Unit of Work starat.
Re: Doctrine 2:stavy entit a transakce
On se o to pořadí stará. Občas ale prostě nelze objektivně určit, které pořadí je to správné, protože kritérií na „správnost“ může být více a mohou jít i proti sobě. Takže Doctrine 2 to aktuálně dělá tak, jak jsem popsal, což je asi lepší z hlediska výkonu, méně dobré je to v některých okrajových případech z hlediska „logiky“. I já osobně nepovažuji současné řešení za šťastné, ale jak říkám – na to není objektivní odpověď a z několika srovnatelných možností to Doctrine 2 prostě dělá zrovna takhle.
Generovanie entit z databaze
Dobry den.
Je mozne vygenerovat entity ak uz mam databazu? Aby som nemusel definovat entity pre tu spustu tabuliek :-)
Re: Generovanie entit z databaze
Asi to půjde, stačilo krátce pohledat: http://www.doctrine-project.org/documentation/manual/2_0/en/introduction
Ale může se samozřejmě stát, že vygenerované entity nebudou úplně ono. Záleží to na konkrétním příkladě.
Re: Generovanie entit z databaze
tam som hladal, ale ak myslis ORM:generate-entities, tak tam pisu, ze generuje entity z mapovacich informacii, takze predpokladam, ze to nebude priamo z DB, takze si musim nadefinovat xml alebo yaml, ak to teda dobre chapem
Re: Generovanie entit z databaze
Ano, je to možné. Nejlepší bude odkaz přímo do dokumentace – http://www.doctrine-project.org/projects/orm/2.0/docs/reference/tools/en#reverse-engineering
Re: Generovanie entit z databaze
Super, dakujem. Mam este jeden problem. Mam tabulku „users“ (PK:id_user), na ktoru robim JOIN tabulky „auths“, ktora ma kompozitny PK (PK:id_driver,loginname FK:id_user FK:id_driver), co je v pohode. Ale v tom istom dotaze chcem spravit JOIN aj na „auths“ a viazana tabulka je authdrivers (PK:id_driver), kde mi doctrine zahlasi: Exception: Single id is not allowed on composite primary key in entity UsersModuleEntitiesAuthdriver.
Neviem, kde moze byt chyba, asi to zle chapem…
blizsi popis problemu: http://forum.nette.org/cs/5291-doctrine-2-join-na-tabulku-s-kompozitnym-pk
Re: Generovanie entit z databaze
Doctrine 2 měla dlouhodobě problémy s takovými kombinacemi kompozitních klíčů. Spoustu toho už před nedávnem opravili, některé kombinace ale tuším ještě zůstaly nefunkční. Neumím teď takhle z hlavy říct, jestli zrovna tohle je ten stále nefunkční případ, k otestování bych potřeboval kompletní kód. Pojďme ale pokračování téhle diskuze přesunout přímo do odkazovaného Nette fóra, kde to snad vyřešíme až do konce.
Re: Generovanie entit z databaze
Dobrý den, jde ječte to načtení entit z databáze již vytvořené?jsem začátečník s Doctrine, takže jsem ráda za každou radu
Uzamykanie riadkov tabuľky
Používa entity manager pri spracovaní transakcie zámky na načítané záznamy????
Ide o to či sa viacero súčasných procesov nad jedným záznamom nepobije.
Re: Uzamykanie riadkov tabuľky
Tohle je věc, kterou si musí každý databázový systém řešit nejlépe sám. PostgreSQL to řeší přes MVCC (http://wiki.postgresql.org/wiki/MVCC), MySQL to na InnoDB řeší AFAIK pomocí zamykání tabulek. Jak je to implementované nad MyISAM netuším. Oracle IMHO transakce podporuje stejně jako PostgreSQL. Záleží tedy, jaký databázi používáte.