Místo merge() je potřeba volat persist(). A ano, v JSE může být
persistentní kontext EXTENDED. Vybírá se to při vytváření kontextu.
Zda je entita ve stavu managed lze zjistit přes EntityContext.contains() a
na přechody mezi stavy jsou anotace @PostRemove, @PostUpdate, atd.

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


Libor Jelinek napsal(a):
> Dobrý den, pane Troníčku,
> máte pravdu, děkuji! Tohle mě vůbec nenapadlo.
>
> Přidal jsem při selhání prvního commit() tedy merge(), abych entitu vrátil
> do managed stavu a pak správně další commit() opět selže.
>
> JPA používám v desktopové Java aplikaci (žádné aplikační servery apod.),
> takže persitentní kontext bude zřejmě TRANSACTION_SCOPED. Nebo může být
> extended i v JSE?
>
> BTW: Je nějaký způsob jak zjistit v jakém ze stavů (new/transient,
> managed,
> detached, removed) se právě entita nachází?
>
> Děkuji
> Libor
>
> Dne 5. září 2011 9:54 "Zdeněk Troníček" <[email protected]> napsal(a):
>
>> Dobrý den,
>>
>> jakého typu je persistentní kontext? Jestliže TRANSACTION_SCOPED, tak na
>> konci transakce (při prvním commitu) jsou všechny entity převedeny do
>> stavu detached a při druhém commitu není v persistentním kontextu žádná
>> entita a tudíž se do databáze nic nezapíše.
>>
>> Z.T.
>> --
>> Zdenek Tronicek
>> FIT CTU in Prague
>>
>>
>> Libor Jelinek napsal(a):
>> > Dobrý den,
>> > prosím můžete mi někdo pomoci vysvětlit a pochopit následující chování
>> v
>> > JPA?
>> >
>> > Záměrně měním primární klíč entity, což je v JPA zakázáno. První
>> commit
>> > tedy
>> > správně vyhodí "Exception Description: The attribute [date] of class
>> > [some.package.Holiday] is mapped to a primary key column in the
>> database.
>> > Updates are not allowed.". Ale druhý a všechny další nic nevyhodí....
>> >
>> > Holiday h1 = EM.find(Holiday.class, new GregorianCalendar(2011, 0,
>> > 3).getTime());
>> >
>> > try {
>> > *    EM.getTransaction().begin();*
>> >     h1.setDate(new GregorianCalendar(2011, 0, 4).getTime());
>> > *    EM.getTransaction().commit()*;
>> >     System.out.println("First commit succeed");
>> > } catch (Exception e) {
>> >     System.out.println("First commit failed");
>> > }
>> >
>> > try {
>> > *    EM.getTransaction().begin();
>> > **    EM.getTransaction().commit()*;
>> >    System.out.println("Second commit succeed");
>> > } catch (Exception e) {
>> >    System.out.println("Second commit failed");
>> > }
>> >
>> > Vypíše se:
>> > First commit failed
>> > Second commit succeed
>> >
>> > Jelikož JPA nemá explicitní operaci update(), tak jediná možnost
>> updatovat
>> > entitu do databáze je commit(), čímž by si EntityManager měl všimnout,
>> že
>> > došlo ke změně v entitě. Jak ale může druhý jakýkoli commit proběhnout
>> > úspěšně, když entita stále obsahuje "neuložitelnou" hodnotu?
>> >
>> > (Používám EclipseLink 2.2.0.v20110202-r8913 s MySQL.)
>> >
>> > Díky za rady
>> > Libor
>> >
>>
>>
>

Odpovedet emailem