problém ale je, jak jsem psal drive, ze objekt clanek neni v okamziku volani metody v perzistentnim kontextu a em.merge(clanek), ktery by ho tam mel pripojit asi nejak nefunguje nebo ho nepouzivam spravne.
"Roman Pichlík" <[EMAIL PROTECTED]> Odeslal: [EMAIL PROTECTED] 03.06.2008 10:47 Odpovězte prosím uživateli Java <[email protected]> Komu Java <[email protected]> Kopie Předmět Re: JPA - Flush() problém public String ulozKomentar() { em = emf.createEntityManager(); em.getTransaction().begin(); em.refresh(clanek); clanek.getKomentareCollection().add(newKomentar); newKomentar.setIdclanek(clanek); em.flush(); em.getTransaction().commit(); em.close(); newKomentar = new Komentare(); return ""; } ten flush je zbytecny, pokud je flush mode spjaty s transakci. > Problem ale je, ze em.merge(clanek) nejak asi nefunguje korektne protoze to > vyhazuje vyjimku: > > java.lang.IllegalArgumentException: Can not refresh not managed object: > nastenka.entity.Clanky[idclanek=2]. > > oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.refresh(EntityManagerImpl.java:381) > nastenka.NastenkaBean.ulozKomentar(NastenkaBean.java:80) > > Pokud ale kod prepisu tak, ze EntityManager necham porad otevreny, tak vse > funguje jak ma. Proto si myslim, ze problem bude v tom jak pripojit Clanek > zpet do persistentniho kontextu. > > > > [EMAIL PROTECTED] wrote on 03.06.2008 10:10:29: > >> > v podstate jde o to, jestli metoda ulozKomentar() pouziva spravny postup >> > jak >> > pridat a ulozit zaznam do kolekce List<Komentare> komentareCollection v >> > instanci (Clanky) clanek >> >> bez kodu te metody tezko rici, kazdopadne to vypada podle popisu, ze >> ten objekt Clanek je odpojeny od persistentniho kontextu. Takze zkuste >> pred tim, nez vlozite ten komentar, zavolat >> >> em.refresh(clanek); >> clanek.getKomentareCollection().add(newKomentar); >> newKomentar.setClanek(clanek); >> em.flush(); >> >> to by melo fungovat >> >> > jj toto pouzivam, jen jsem myslel, jestli by to JPA neumelo nejak >> "automaticky" >> >> neznam JPA, ale v Hibernatu se to ridi atributem inverse, ktery urcuje >> toho kdo ridi relaci, jestli strana one a nebo strana many. Elegantni >> reseni je to mit osetrene na urovni domenoveho modelu, aby se clovek >> nemusel podrizovat tomu, ze ve spodu je nejaky ORM framework. >> >> public class Clanek { >> public void addComment(Komentar comment) { >> getKomentareCollection().add(comment); >> comment.setClanek(this); >> } >> >> ..... >> } >> >> -- >> S pozdravem Roman "Dagi" Pichlik >> >> /* http://www.sweb.cz/pichlik/ Blog pro kodery */ > -- S pozdravem Roman "Dagi" Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */
