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