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

Mariák Kálmán sirkalmi at kalmiesemese.hu
2011. Ápr. 11., H, 23:11:24 CEST


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




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