/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Hjælp ønskes til Hibernate mapping af Set
Fra : Janus


Dato : 26-01-08 18:20

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

 
 
Janus (07-02-2008)
Kommentar
Fra : Janus


Dato : 07-02-08 03:44

[snip]

Jeg har fundet problemet: Man kan ikke have one-to-many associationer
i en union-subclass med mindre de er inverse="true", altså at de er bi-
direcional:
http://www.hibernate.org/hib_docs/reference/en/html/inheritance.html#inheritance-limitations


Hejhej!

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste