Re: JPA/Hibernate remove entity a cizi klice

2010-07-01 Tema obsahu Kamil Podlesak
Zdravím,

 Rád bych upozornil na jednu slabinu této metody: jakmile dojde k
výjimce, provede se automaticky rollback. Takže pokud v té transakci
máte více operací, tak je ztratíte všechny.
 Při použití čistého JDBC můžete u některých databází chybu ignorovat
a transakci commitnout i tak, ale to nebude fungovat na všech
databázích (např. postgresql automaticky při chybě také provede
rollback).

 Pokud výše uvedené nevadí, rollback se má provést a celý problém je
jen ve výjimce v logu... já bych to klidně ignoroval, pokud se to bude
stávat vzácně. Pokud je to zcela běžná situace, pak bych použil čisté
řešení: kontrolovat stav před mazáním.

Kamil Podlešák

2010/6/30 Ondra Medek xmed...@gmail.com:
 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



Re: JPA/Hibernate remove entity a cizi klice

2010-07-01 Tema obsahu Ondra Medek
 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.

To neni uplne optimalni reseni, protoze vazby na jine entity muze
vytvaret nebo rusit jiny uzivatel.

  Pokud výše uvedené nevadí, rollback se má provést a celý problém je
 jen ve výjimce v logu... já bych to klidně ignoroval, pokud se to bude
 stávat vzácně. Pokud je to zcela běžná situace, pak bych použil čisté
 řešení: kontrolovat stav před mazáním.

Ano je to vcelku bezna situace. Zatim tedy delam kontrolu pred mazanim.

Diky vsem za rady.

P.S. nekdy mi to JEE pripada jako proc to delat jednoduse, kdyz to
jde delat slozite :-)


JPA/Hibernate remove entity a cizi klice

2010-06-30 Tema obsahu Ondra Medek
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


Re: JPA/Hibernate remove entity a cizi klice

2010-06-30 Tema obsahu Zdeněk Troníček
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