Re: JPA/Hibernate remove entity a cizi klice
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
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
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
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