Announcement

Collapse
No announcement yet.

"Mehrfachvererbung" in EJB3.0

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Mehrfachvererbung" in EJB3.0

    Hallo,

    ich hab folgendes Problem:

    @Entity
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "group", discriminatorType = DiscriminatorType.STRING)
    class Person {
    String name;
    ...
    Group group; //enum

    }
    @Entity
    @DiscriminatorValue(value="FRIEND")
    class Friend extends Person {
    Location location; //enum
    }


    Wenn ich nun weitere Unterteilung von Friend machen will, basiert auf die enum locatiion, damit diese dann in die gleiche Tabelle reinkommt, was soll ich da alles machen? Folgends habe ich probiert, leider ohne Erfolg:

    1. Einfach ohne zusätzliche Annotation
    class SchoolFriend extends Friend {
    }


    dann hab ich Exception bekommen, die besagt, dass das enum GROUP SchoolFriend nicht exisitiert

    2. Verwende die gleiche Value wie die parent-Klasse
    @Entity
    @DiscriminatorValue(value="FRIEND")
    class SchoolFriend extends Friend {
    }

    aber wenn ich versuche ein SchoolFriend zu kriegen ->
    entityManager.find(SchoolFriend.class, 1l)
    bekomme ich immer eine null obwohl ein Objekt vom Typ SchoolFriend vorher persistiert wurde.
    höchstens kann ich nur folgendes aufrufen
    entityManager.find(Friend.class, 1l)
    diese kann ich aber auch nicht zu SchoolFriend casten

    3. ich versuche mehrere DiscriminatorColumn verwenden:
    @Entity
    @DiscriminatorValue(value="FRIEND")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "location", discriminatorType = DiscriminatorType.STRING)
    class Friend extends Person {
    Location location; //enum
    }

    @Entity
    @DiscriminatorValue(value="SCHOOL_FRIEND")
    class SchoolFriend extends Friend {
    }

    --dies funktioniert auch leider nicht, bekomme die Exception, dass kein Enum GROUP SCHOOL_FRIEND exisitiert


    bin für jede Hinweise sehr dankbar

    Gruß

  • #2
    Habe zwar nicht verstanden was das bedeutet,

    Wenn ich nun weitere Unterteilung von Friend machen will, basiert auf die enum locatiion
    aber wenn du eine abgeleitete Klasse in einer SingleTable persitieren willst, benötigt diese

    @DiscriminatorValue("xxxx")

    den Wert der in die Column geschrieben wird.

    Mir ist unklar wo die Klasse Friend ist, wenn Person die Basisklasse íst

    Des Weiteren nutze bitte die Codeformatierung
    Christian

    Comment


    • #3
      Hi Christian, danke für Deine Antwort, sorry für mein Deutsch

      Originally posted by Christian Marquardt View Post

      aber wenn du eine abgeleitete Klasse in einer SingleTable persitieren willst, benötigt diese

      @DiscriminatorValue("xxxx")

      den Wert der in die Column geschrieben wird.
      Das habe ich ja schon gemacht.
      Also, nächster Versuch

      Person hat das Attribut "Group" vom Typ ENUM. Dieses wird nun als DiscriminatorColumn verwendet für die Unterklasse von Person (i.e. Friend).. es sieht dann so aus:

      Code:
      @Entity
      @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
      @DiscriminatorColumn(name = "group", discriminatorType = DiscriminatorType.STRING)
      class Person {
      String name;
      ...
      Group group; //enum
      
      }
      @Entity
      @DiscriminatorValue(value="FRIEND")
      class Friend extends Person {
      Location location; //enum
      }
      Jetzt möchte ich noch Unterklassen von Friend haben (i.e. SchoolFriend). Wie Du siehst, hat Friend dann das Attribut location vom Type ENUM. Die Unterklassen unterscheiden sich eben durch dieses Attribut (sowie das Attribut GROUP für die Unterklassen von Person).

      Die Frage ist nun, welche Annotation soll die Unterklassen von Friend dann haben? ich hatte die 3 verschiedene Versuche gehabt, aber jeder verursacht dann ein eigenes Problem (siehe erste Post)

      noch mal Danke ;-)

      Comment

      Working...
      X