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 "";
[EMAIL PROTECTED] 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" <[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 */