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