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 <[EMAIL PROTECTED]>:

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 */






Odpovedet emailem