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