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).