Hallo
ich habe oft folgendes Problem mit lazy proxies:
Code:
+----------------------+
| ZusammenGesetzterTyp |
+----------------------+
| ... | * +-----------+
| member: MemberTyp +------------>+ MemberTyp |
| ... | +-----------+
+----------------------+ | |
| ... | +-----------+
+----------------------+ ´|`
|
+------------+-------------+
| |
+--------+------+ +--------+------+
| MemberSubTyp1 | | MemberSubTyp2 |
+---------------+ +---------------+
| | | |
+---------------+ +---------------+
implementiere ich oft mit:
Code:
<class name="ZusammenGesetzterTyp" table="ZUSAMMEN_GESETZTER_TYP" lazy="true">
...
<many-to-one name="member" column="MEMBER_TYP_ID"
class="MemberTyp"/>
...
</class>
und:
Code:
<class name="MemberTyp" table="MEMBER_TYP" lazy="true">
...
<subclass name="MemberSubTyp1" discriminator-value="1">
...
</subclass>
<subclass name="MemberSubTyp2" discriminator-value="2">
...
</subclass>
</class>
Wenn ich bspw. folgende Instanz zuvor persistent gemacht habe:
Code:
zg = new ZusammenGesetzterTyp();
zg.setMember(new MemberSubTyp2());
und ich nachher abfrage:
Code:
Query query = session.createQuery("from ZusammenGesetzterTyp as inst where inst.id = :id");
query.setInt("id", zg.getId().intValue());
Object result = query.uniqueResult();
ZusammenGesetzterTyp zg2 = (ZusammenGesetzterTyp) result;
MemberTyp member = zg2.getMember();
MemberSubTyp2 st2 = (MemberSubTyp2) member;
dann erhalte ich beim letzten Statement eine ClassCastException. Meine Erklärung dafür ist, dass Hibernate einen Lazy-Proxy für MemberTyp anlegt, der dann auch nur als solcher ansprechbar ist.
Meine Frage ist, gibt es bessere Designs?