[Java lista] JPA - Hogyan inzertáljak egy-több kapcsolatban lév? adatokat?

Eperjesi Alfréd alfred.eperjesi at gmail.com
2011. Ápr. 12., K, 13:28:46 CEST


Hello,


Nem tudom milyen JPA vendort használsz, de pl. a Hibernateben a
load(id) pont ezt csinálja. Egy proxyt hoz létre és csak a PK - t
állítja be, a get(id) viszont az egész objekltumot kiszedi.

http://www.intertech.com/Blog/post/Hibernate-Load-and-Get.aspx

ea

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
>
>
> _______________________________________________
> Javalist mailing list
> Javalist at javagrund.hu
> http://javagrund.hu/mailman/listinfo/javalist
>


További információk a(z) Javalist levelezőlistáról