JPA - Flush() problém

Zdenek Tronicek tronicek na fel.cvut.cz
Pondělí Červen 9 07:23:50 CEST 2008


Dobry den,

em.merge(clanek) funguje, ale patrne jinak nez ocekavate. Udela to, ze  
vyhleda v perzistentnim kontextu entitu se stejnym id jako ma parametr  
(pokud tato entita v perzistentnim kontextu neexistuje, tak ji  
vytvori), pak hodnoty atributu z parametru prekopiruje do teto entity  
a nakonec tuto entitu vrati.
Funguje tak proto, ze v okamziku, kdy volate merge() uz muze byt v  
perzistentnim kontextu entita s danym id a protoze tam nemohou byt dve  
entity se stejnym id, nelze parametr jednoduse prevest do managed stavu.

Vetsinou je tedy spravne prebirat navratovou hodnotu merge.

Jinak to flush nema zadne opodstatneni, jak uz psal Dagi.

Z.T.
-- 
Zdenek Tronicek
Department of Computer Science and Engineering
Prague                   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Quoting Pavel Zelenka <Zelenka na mediaservis.cz>:

> 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ší informace o konferenci Konference