[Java lista] JPA - Hogyan inzertáljak egy-több kapcsolatban lév? adatokat?
Zsombor
gzsombor at gmail.com
2011. Ápr. 12., K, 00:24:03 CEST
2011/4/11 Mariák Kálmán <sirkalmi at kalmiesemese.hu>
> Szervusztok!
>
> Egy-több kapcsolatban lévő adatok inzertálására van egy bevett
> eljárásom, amivel kapcsolatban problámák adódtak. Ezt az eljárást sehol
> nem olvastam, magam találtam ki, ezért lehet, hogy tök rosz az egész.
> Elsőként bemutatom az eljárásomat, aztán arra volnék kiváncsi, hogy ti
> hogyan oldjátok meg ezeket a dolgokat.
>
> PĂ©lda:
> Egy felhasználót hozzáadunk egy csoporthoz. A felhasználó és a csoport
> azonosĂtĂłk paramĂ©terbĹ‘l jönnek. A felhasználĂłt az azonosĂtĂłja alapján
> elkérem az EntityManager-től. Eddig semmi szokatlan. A csoport esetében
> viszont az entitásokat Ă©n pĂ©ldányosĂtom, amelynek csak az id
> tulajdonságát állĂtom be. Ez pont elĂ©g ahoz, hogy ez alapján a
> kapcsolatokat megfelelően le tudja tárolni az adatbázisban.
>
> User user = em.find(User.class, userId);
> Set<Group> groups = new HashSet<Group>();
> Group group = new Group();
> group.setId(groupId);
> user.setGroups(groups);
> em.merge(user);
>
> Ezt anno azĂ©rt találtam Ăgy ki, hogy takarĂ©koskodjak az erĹ‘forrásokkal,
> és hogy ne kelljen értelmetlenül az adatbázishoz fordulni, mikor eleve
> minden információ rendelkezésre áll amit le kell tárolni. Ugyanakkor
> kényelmes is amit az alábbi példában szemléltetek:
>
> A User entitásnál maradva, annak van egy CompanyType tĂpusĂş
> tulajdonsága. Ha a company type szintén paraméterből jön akkor azt a
> User entitás setCompanyTypeId metĂłdussal állĂtom be, amiben
> pĂ©ldányosĂtok egy CompanyType objektumot, majd meghĂvom vele a
> setCompanyType metĂłdust, ezzel beállĂtva a kapcsolatot.
>
> Az alap settter metĂłdus.
> public void setCompanyType(CompanyType companyType) {
> this.companyType = companyType;
> }
>
> A "kĂ©nyelmi" kiegĂ©szĂtĹ‘ setter metĂłdus
> public void setCompanyTypeId(Long companyTypeId) {
> CompanyType companyType = new CompanyType();
> companyType.setId(companyTypeId);
> setCompanyType(companyType);
> }
>
> A paraméterek rendszerint JSON fromátumban érkeznek, amit a Jackson nevű
> eszköz mappel rá az entitásokra. A paraméterek nevei alapján
> automatikusan meghĂvja a setter metĂłdusokat. Pl a fenti pĂ©ldában, ha a
> JSON-ban van egy companyTypeId paramĂ©ter akkor a Jackson meghĂvja a
> setCompanyTypeId metĂłdust.
>
> A probláma ezzel az egésszel az, hogy persist vagy merge után a program
> egy egészen más pontján, pl egy JPQL lekérdezés során visszaadott
> eredmĂ©nyben, ha szerepelnek ezek az entitások melyek, Ăgy Ă©n álltalam
> lettek pĂ©ldányosĂtva, akkor ezeknek a tulajdonsági mind null-ok lesznek
> az id-t leszámĂtva. Ezen csak egy webapp restart segĂt, mikor
> valĂłszĂnűleg kiĂĽrĂĽl az Entit Manager -ben a cache Ă©s ĂşjbĂłl beolvas
> mindent.
>
> Egyelőre két megoldást látok, vagy felhagyok ezzel a megoldással és
> mindig minden entitást id alapján elkĂ©rek az EM-tĹ‘l Ă©s ezeket állĂtom
> be, vagy lekérdezésekkor ellenőrzöm, hogy adott tulajdonság null-e és,
> ha igen akkor meghĂvom az adott entitásra az EM update metĂłdusát, amely
> frissĂti az adatbázisbĂłl az összes tulajdonságát.
>
> Mind a két megoldás macera, nem tetszik. Mitévő legyek?
>
> Köszi a válaszokat!
>
> Mariák Kálmán
> sirkalmi
>
>
Egy enitityManager.find(cls, id) hivás nem feltétlenül jelent adatbázis
lekérdezést, és használd azt, ne próbáld meg megerőszakolni a JPA
implementációt ilyen kis trükkökkel.
ĂĽdv
Zs
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20110412/2a4b95a9/attachment.html
További információk a(z) Javalist levelezőlistáról