V ramci jedne transakce muzete vkladat (em.persist) entity v libovolnem
poradi. Framework by mel zavislosti mezi entitami poznat a odpovidajici
INSERTy provest ve spravnem poradi, prip. si poradit jinak. Protoze mezi
entitami mohou byt cyklicke zavislosti, musi framework zavislosti nejak
resit.

Napr. Person muze mit odkaz na Dog a Dog muze mit odkaz na Person (nemam
ted na mysli obousmerny vztah, ale dva jednosmerne, tj. v databazi budou
dva cizi klice: jeden v tabulce Person a druhy v tabulce Dog).
EclipseLink si s tim poradi takto: nejprve vlozi zaznam do tabulky Person
s hodnotou ciziho klice null. Pak vlozi zaznam do tabulky Dog a nakonec
nastavi hodnotu ciziho klice v tabulce Person.

FINE: INSERT INTO PERSON (NAME, DOG_ID) VALUES (?, ?)
        bind => [Harry, null]
FINE: values IDENTITY_VAL_LOCAL()
FINE: INSERT INTO DOG (NAME, PERSON_ID) VALUES (?, ?)
        bind => [Gita, 1]
FINE: values IDENTITY_VAL_LOCAL()
FINE: UPDATE PERSON SET NAME = ?, DOG_ID = ? WHERE (ID = ?)
        bind => [Harry, 1, 1]

em.flush() je vetsinou zbytecny a u viceuzivatelskych aplikaci muze vest k
degradaci vykonu. Pokud si tedy nejste jisty, ze flush() potrebujete,
doporucuji jej nepouzivat.

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


Pavel Marek napsal(a):
> Upravit zakládání záznamů. Nejdřív založit rodiče a až pak děti. Radši dát
> za každým rodičem flush().
> Nebo nastavit kaskády a ukládat jen jediný vrcholový záznam.
>
> Pavel Marek
>
> 2010/9/17 Oto Buchta <[email protected]>
>
>> Evidentne nejde. Ale co s tim?
>>
>> 2010/9/17 Pavel Marek <[email protected]>:
>> > Zapni si logování Hibernate SQL a sleduj pořadí. Ten nadřízený uzel
>> musí
>> jít
>> > do databáze dřív. Nestačí že jde ve stejné transakci.
>> >
>> > Pavel Marek
>> >
>> > Dne 2010 9 17 01:19 "Oto Buchta" <[email protected]> napsal(a):
>> >
>> >> Zdravím ve spolek,
>> >> dnes jsem migroval z jednoho počítače na druhý a identický kód, který
>> >> (snad, možná jsem něco klíčového dělal ručně,
>> >> je to už kapku dávno, ale tipnul bych si že určitě) dříve fungoval,
>> >> nad nově nainstalovanou DB mi místo korektního vytvoření stromové
>> >> struktury databázi hodí
>> >>
>> >> ERROR: insert or update on table "uzel" violates foreign key
>> >> constraint "fka5b61e61bd9f0dfb"
>> >> Detail: Key (parent_uzel)=(1) is not present in table "uzel".
>> >>
>> >> Jedná se o to, že DB je prázdná a onen uzel s id=1 skutečně v DB
>> není,
>> >> ale v rámci téže transakce jsem jej uložil pomocí session.save()
>> >>
>> >> Napadá vás, co jsem kde udělal špatně?
>> >> --
>> >> Oto 'tapik' Buchta, [email protected], http://tapikuv.blogspot.com
>> >
>>
>>
>>
>> --
>> Oto 'tapik' Buchta, [email protected], http://tapikuv.blogspot.com
>>
>

Odpovedet emailem