4 Stimmen

JPA Zuordnungs-Schnittstellen

Ich habe Schwierigkeiten, eine Zuordnung zu erstellen, wenn der Listentyp eine Schnittstelle ist. Es scheint, dass ich eine abstrakte Klasse erstellen und die Diskriminatorspalte verwenden muss. Ist das der Fall? Ich würde das lieber nicht tun, da die abstrakte Klasse nur eine abstrakte Methode enthalten würde und ich die Schnittstelle lieber beibehalten würde.

Ich habe eine Schnittstelle, nennen wir sie Konto

public interface Account {
 public void doStuff();
}

Jetzt habe ich zwei konkrete Implementierungen von Account OverSeasAccount und OverDrawnAccount

public class OverSeasAccount implements Account {
 public void doStuff() {
   //tu Überseeartige Sachen
 }
}

UND

public class OverDrawnAccount implements Account {
 public void doStuff() {
   //tu überzogene Sachen
 }
}

Ich habe eine Klasse namens Arbeit mit einer Liste

private List accounts; 

Ich schaue mir Diskriminatorfelder an, aber anscheinend kann ich das nur für abstrakte Klassen tun. Ist das der Fall? Jeder Hinweis wird geschätzt. Kann ich Diskriminatoren für Schnittstellen verwenden?

2voto

Vincent Ramdhanie Punkte 100426

Ich denke, dass es möglich ist, eine Schnittstelle zum Supertyp einer Zuordnung zu machen. Möglicherweise können Sie jedoch keine Annotationen verwenden. Annotationen funktionieren gut mit XML-Konfigurationsdateien, sodass Sie möglicherweise eine Hibernate-Konfigurationsdatei zu Ihrem Projekt hinzufügen müssen, in der die benötigten Zuordnungen enthalten sind. Aber Sie werden in der Lage sein, die Annotationen für den Rest Ihres Projekts beizubehalten.

Dieses Problem diskutiert es genauer. Es scheint mit einem Vorschlag zu enden, wie man es mit Annotationen machen kann, also wer weiß. Ich würde vorschlagen, dass XML derzeit noch sicherer ist. Diese Seite der Dokumentation erläutert die erforderliche XML-Mapping.

1voto

Andrea Francia Punkte 9167

Sie können auch eine abstrakte Klasse ohne Entfernen des Interface einführen.

// kein Entity
public interface Account {
    public void doStuff();
}

@Entity
public abstract class BaseAccount {
    public void doStuff();
}

@Entity
public class OverSeasAccount extends AbstractAccount {
    public void doStuff() { ... }
}

@Entity
public class OverDrawnAccount extends AbstractAccount {
    public void doStuff() { ... }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X