Spring / OpenJPA Inheritance: Subklassen werden nicht erkannt

Status
Nicht offen für weitere Antworten.

Nejah

Mitglied
Guten Morgen allerseits,

ich setze mich derzeit mit OpenJPA und Spring auseinander und habe folgendes vor:
Ich leite mehrere Klassen von einer Hauptklasse ab. Gemappt soll das Ganze allerdings in nur einer Tabelle werden, also wende ich InheritanceType.SINGLE_TABLE an und gebe den Unterklassen einen Diskriminator-Wert.
Das ganze Management wird bei mir vom Spring Framework übernommen.

Das Ganze schaut dann so aus:

Java:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="doc_type", discriminatorType=DiscriminatorType.STRING)
public abstract class Document {

// ...

}

@Entity
@DiscriminatorValue(value="Magazine")
public class Magazine extends Document {

// ...

}

@Entity
@DiscriminatorValue(value="Book")
public class Book extends Document {

// ...

}

Nun erhalte ich beim Aufruf leider folgende Fehlermeldung:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Could not map discriminator value "Book" to any known subclasses of the requested class "project.entities.Document" (known discriminator values: [Document, Magazine]).; nested exception is <openjpa-1.2.1-r752877:753278 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Could not map discriminator value "Book" to any known subclasses of the requested class "project.entities.Document" (known discriminator values: [Document, Magazine]).

Offenbar sind aus irgendeinem Grund nur die Hauptklasse und die Unterklasse Magazine bekannt. Mit Book (und einigen weiteren Klassen, die ebenfalls von Document abgeleitet sind) gibt es anscheinend ein Problem.

Da ich mit beidem noch nicht lange arbeite, bin ich mir nicht sicher, ob das Problem in Spring, OpenJPA oder doch bei mir (wohl am wahrscheinlichsten) liegt. Hat jemand eine Idee? Gibt es noch Besonderheiten bei @Inheritance zu beachten, die bei Magazine zufällig von mir eingebaut worden sein könnten und bei den anderen Klassen nicht?
 
Zuletzt bearbeitet:

byte

Top Contributor
Kenne mich mit mit OpenJPA nicht aus. Aber bei Hibernate muss man IIRC auch in der abstrakten Oberklasse einen @DiscriminatorValue angeben (auch wenn der gar nicht genutzt wird). Vielleicht liegts ja daran!?
 

Nejah

Mitglied
Hm... also in etwa so:

Java:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="doc_type", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="Document")
public abstract class Document {

// ...

}

:noe:

Bringt leider auch nichts. Jetzt gefällt ihm zwar eine andere der Unterklassen nicht, aber ansonsten bleibt die Fehlermeldung gleich, erkannt werden also immernoch nur die beiden Diskriminator-Werte.

OpenJPA setzt meines Wissens die jeweiligen Diskriminator Werte auch selbst, wenn sie nicht explizit angegeben wurden. Dafür nimmt es dann einfach die Klassennamen.
 

Nejah

Mitglied
Importiert sind jeweils bei den Subklassen:

Java:
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

und bei der Hauptklasse:

Java:
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

Und noch ein paar weitere Annotationen für das Mapping der Attribute.
Müsste eigentlich stimmen, denke ich...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben