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