ten kod mozna funguje, ale je to pekny nonsense. merge se vola uplne
mimo transakci, takze pojede pravdepodobne v autocommit modu. Tim
padem je zbytecne i to cachrovani s tou transakci.
Prepiste to nasledujicim zpusobem, aby to davalo smysl.
em = emf.createEntityManager();
em.getTransaction().begin();
em.refresh(clanek);
clanek.getKomentareCollection().add(newKomentar);
newKomentar.setIdclanek(clanek);
em.getTransaction().commit();
em.close();
pokud by se to neulozilo na commit transakce tak je potreba zmenit
flush mode a nebo ten flush proste zavolat.
2008/6/3 Pavel Zelenka <[EMAIL PROTECTED]>:
>
> 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 */
>
--
S pozdravem Roman "Dagi" Pichlik
/* http://www.sweb.cz/pichlik/ Blog pro kodery */