Ahoj,

lepsi nez em.flush() je chytat vyjimku po skonceni transakce. Bude to
RollbackException. Napr.:

    try {
        em.getTransaction().begin();
        Programmer p = em.find(Programmer.class, 1L);
        em.remove(p);
        em.getTransaction().commit();
    } catch (RollbackException e) {
        ...
    }

I v takovem pripade se ovsem v logu objevi chyba od databaze. Je to
logicke: poslali jsme ji prikaz, ktery skoncil chybou a to by se melo vzdy
logovat. Ze to na urovni aplikace neni chyba, databaze nevi.

Resit to jde na aplikacni urovni: umoznit uzivateli mazani jen tech entit,
na ktere nejsou odkazy. Tj. napr. pokud uzivatel vybira entity ke smazani
z nejakeho seznamu, tak v seznamu zobrazit jen entity, na ktere nesmeruje
zadny odkaz.

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


Ondra Medek napsal(a):
> Ahoj,
>
> chci vymazat JPA entitu, ktera muze byt refencovana pres cizi klice. V
> takovem pripade chci uzivateli zobrazit nejake hlaseni "nelze
> vymazat". Klasicke JDBC reseni bych delal pres DELETE FROM ...,
> odchytnu SQLException a zobrazim hlaseni. V JPA/Hibernate mohu delat
> neco podobneho:
>
> try {
> em.remove(...);
> em.flush();
> } catch () {
>  // nelze vymazat
> }
>
> Tady mne zarazi, ze:
>
> 1. catch chyti jakousi obecnou  javax.persistence.PersistenceException
> (nested org.hibernate.exception.GenericJDBCException a dalsi nested
> java.sql.BatchUpdateException: failed batch)
> 2. Hibernate zaloguje chyby:
> 14:43:09,890 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: null
> 14:43:09,890 ERROR [JDBCExceptionReporter] failed batch
> 14:43:09,890 ERROR [AbstractFlushingEventListener] Could not
> synchronize database state with session
>
> Tak si rikam, ze to asi nebude spravne reseni, kdyz Hibernate loguje
> chyby. Navic nechci mit v logu chyby, kdyz vlastne k zadne chybe
> nedoslo. Nemohu ovsem najit, jak se ma v takovem pripade spravne
> postupovat? Manualni kontrola JPQL/HQL query pred em.remove()? Pokud
> ano, neni to trochu tezkopadne?
>
> Dik za radu
> Ondra Medek
>

Odpovedet emailem