Hibernate: mappedBy és superclass
bullet Crystal -- 2009-05-15
A Hibernate az egyik legrégibb, legelterjedtebb és legfejlettebb ORM framework Java-hoz. Az a nagyon jó benne, hogy az ember simán le tudja mappolni vele entitásainak 95%-át. És az a nagyon rossz, hogy a maradék 5%-kal órákat, napokat lehet szívni.

A szívás aktuális tárgya a következő probléma: A és B osztály 1-N relációban áll egymással, tehát A-ban van egy Collection<B> típusú property, B-ben pedig egy A típusú. A Hibernate-et az viccelte meg, hogy a B-ben az A típusú property nem B-ben, hanem annak ősosztályában, C-ben volt deklarálva. Na de inkább nézzünk kódot:

@Entity
class C {
@ManyToOne
private A a;
}

@Entity
class B extends C {
}

@Entity
class A {
@OneToMany(mappedBy = "a")
private Collection<B> b;
}

Tehát itt a @OneToMany annotációra kivételt dobott, mondván hogy a B osztályban nincs "a" nevű property. A problémára én nem nagyon találtam megoldást, amit mégis azt azért leírom. Az egyik lehetőség nyilván az, hogy a "b" property-t @Transient-ként annotáljuk, de így a hibernate nem fogja fetch-elni, ezt manuálisan kell megcsinálni (szerintem ez elfogadható kompromisszum). A másik, hogy a C-t @Entity-vel és @MappedSuperclass-szal egyaránt annotáljuk. Iyenkor a single table inheritance ugrik, (más inheritance mapping-ot nem próbáltam) tehát nagyon érdemes megfontolni, hogy milyen teljesítményveszteséggel jár ez a megoldás, és hogy ez nekünk mennyire probléma.

Egyébként a hibernate team szerint ez nem bug, hanem feature, de hogy miért azt nem sikerült megtudnom. Állítólag van valahol egy fórum post, ahol alaposan el van magyarázva hogy miért így (nem) működik a dolog, de ezt nekem nem sikerült megtalálni. Ha valakinek sikerül, akkor kommentbe kérek linket :)
/* */ kommentek
Új komment:
név:
email:
website:

Captcha



megjegyzés