Re: JPA - Flush() problém

Pavel Zelenka Zelenka na mediaservis.cz
Úterý Červen 3 12:01:48 CEST 2008


takže nakonec jsem to vyřešil tak, že změny do objektu clanek ulozim pred 
volanim em.merge()

public String ulozKomentar() {
        em = emf.createEntityManager();
        clanek.getKomentareCollection().add(newKomentar);
        newKomentar.setIdclanek(clanek);
        em.merge(clanek);
        em.getTransaction().begin();
        em.flush();
        em.getTransaction().commit();
        em.close();
        newKomentar = new Komentare();
        return "";


konference-bounces na java.cz wrote on 03.06.2008 11:15:28:

> 
> 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" <roman.pichlik na gmail.com> 
> Odeslal: konference-bounces na java.cz 
> 03.06.2008 10:47 
> 
> Odpovězte prosím uživateli
> Java <konference na java.cz>
> 
> Komu
> 
> Java <konference na java.cz> 
> 
> 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.
> >
> >
> >
> > konference-bounces na java.cz 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 */
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://amaio.cz/pipermail/konference/attachments/20080603/0b3f0bc5/attachment.htm>


Další informace o konferenci Konference