Vaclav Pech wrote:

Děkuji za upřesnění ohledně Hibernate.initialize().
Vaše upozornění na nebezpečí automatického updatu databáze po proiterování 
kolekce mi připadá velmi užitečné. Mohl bych Vás požádat o podrobnější popis 
předpokladů, za kterých k tomu dojde?
Záleží na tom, jaká je nastavena izolační úroveň transakcí a zda jsou objekty v 
dané kolekci verzovány?

Ani na jedno nezalezi.
Zalezi na nastaveni 'cascade' pro many-to-one (one-to-many, many-to-many) a 'inverse'. Pokud neni cascade "none" nebo inverse="true", tak k updatu dojde, protoze po vytvoreni noveho listu se ta kolekce stane pro Hibernate dirty.


S mapovanim relaci jako list je to vubec problematicke, pokud vam nezalezi na poradi, tak vzdy pouzivejte set. Mazani ze setu je na jeden update, mazani s listu vyzaduje vzdy 2 - smazani zaznamu a oprava indexu. (pripadne jeste select, pokud zaznam nebyl nacteny). Z listu taky rozumne nelze mazat pomoci HQL (SQL), protoze musite vzdy opravit indexy.


Jinak verzovani a transakce zase funguji jinak.
Transakce se jen propaguji dal do JDBC, na chovani Hibernatu nenamji vliv. Hibernate vam pouze vrati vyjimku, kdyz transakce z nejakeho duvodu selzou, umoznuje je commitovat a rollbackovat. Tot vse. Hibernate jen obaluje JDBC, to je dobre si uvedomit, pocitat s tim a pouzivat ho podle toho.

Verzovani funguje tak, ze Hibernate pri updatu (delete) pridava do where pominky navic verzi, a pokud muj JDBC statement vrati, ze pocet updatovanych (smazanych) zaznamu je 0, vrati vyjimku (trochu to zjednodusuji). Jedna se v podstate o optimisticke zamykani na urovni zaznamu. V kombinaci s transakcemi READ COMMITED vam zajisti uroven REPETABLE READ nad verzovanymi tridami (tabulkami).


   Lukas

PS: docela zajimave pokrocile cteni o Hibernatu je napr. http://shinetech.com/pages/viewpage.action?pageId=649 (ale predne bych si precetl cely manual nebo knizku Hibernate in Action).

Odpovedet emailem