| Hej NG,
 
 
 Jeg har følgende klasser:
 
 public abstract class AbstractClass1 {
 private Long abstract_id;
 public int num;
 public String name;
 ...
 
 }
 
 public abstract class AbstractClass2 extends AbstractClass1 {
 public int x;
 public int y;
 ...
 
 }
 
 public class ConcreteClass1 extends AbstractClass2 {
 public int width;
 public int height;
 ...
 
 }
 
 Jeg kunne godt tænke mig at mappe således, at klassen AbstractClass1
 og AbstractClass2 ikke får en tabel, men at ConcreteClass overtager
 AbstractClass'ernes variable. Jeg har forsøgt at mappe denne
 konstellation vha. union-subclass, og selve mappingen går fint:
 
 <hibernate-mapping>
 <class name="AbstractClass1" table="ABSTRACT_CLASS1"
 abstract="true">
 <id name="abstract_id" column="abstract_id"
 type="java.lang.Long"
 access="field">
 <generator class="increment"/>
 </id>
 
 <property name="num"/>
 <property name="name"/>
 
 <union-subclass name="AbstractClass2" extends="AbstractClass1"
 table="ABSTRACT_CLASS2" abstract="true">
 <property name="x"/>
 <property name="y"/>
 
 <union-subclass name="ConcreteClass"
 extends="AbstractClass2"
 table="CONCRETE_CLASS">
 <property name="height"/>
 <property name="width"/>
 </union-subclass>
 </union-subclass>
 </class>
 </hibernate-mapping>
 
 Der er så flere subclasses som ConcreteClass, disse har jeg udeladt af
 ovenstående mapping-fil.
 
 I en anden mapping vil jeg gerne have et Set af typen AbstractClass1,
 således Settet kan indeholde alle klasser, der extender AbstractClass1
 (så som ConcreteClass):
 
 ...
 <set name="set" cascade="save-update">
 <key column="some_id"/>
 <one-to-many class="AbstractClass1"/>
 </set>
 ...
 
 Men ak!, det virker desværre ikke. Når jeg i mit program forsøger mig
 med:
 
 session.beginTransaction();
 SomeClass sc = new SomeClass(); // har ovenstående Set mapping.
 sc.getSet().add(new ConcreteClass());
 session.save(sc);
 session.getTransaction().commit();
 
 -får jeg denne fejlmeddelelse: Invalid object name 'ABSTRACT_CLASS1'.
 Jeg har fundet ud af, at fejlen er, at det er AbstractClass1-klassen
 jeg bruger i min Set-definition. Den er jo abstract og derfor ikke
 mappet til en tabel, men Set'et forventer åbenbart denne tabels
 eksistens.
 
 Hvordan løser jeg dette mapping-problem? Alle mine superklasser er
 abstrakte og jeg har ikke lyst til at lave en konkret mapping, der kan
 fungere som parent for mine ConcreteClass'es og dermed som
 klassedefinition i Set'et. En sådan løsning vil gøre mit arvehierarki
 kluntet at se på.
 
 Pft,
 
 Janus
 
 
 |