2010-02-03 9 views
14

Ich habe eine Reihe von abstrakten Oberklassen, von denen meine konkrete Klasse verschiedene Methoden erben. Einige dieser Methoden müssen JPA- oder JAXB-Annotationen in der konkreten Klasse enthalten. Momentan mache ich das über folgendes:Die beste Methode zum Hinzufügen von Anmerkungen zu geerbten Methoden

@MyLocalAnnotations 
@Override 
public method inheritedMethodHere (yadda yadda) 
    { 
    super.inheritedMethodHere(yadda yadda); 
    } 

Gibt es eine Möglichkeit, dies ohne Überschreiben der Methode zu tun? Es scheint so eine Verschwendung zu sein, eine Methode zu überschreiben, nur um lokale Anmerkungen zu liefern.

+0

Ich wollte auch hinzufügen, dass der Grund, warum ich Anmerkungen in den konkreten Unterklassen an erster Stelle erstellen musste, war, weil sie unterschiedliche Tabellennamen in JPA und Elementnamen in JAXB verwenden. Die Oberklasse ist in diesem Fall auch generisch. – HDave

Antwort

9

Leider gibt es keinen besseren Weg als das, was Sie jetzt tun. Um das zu tun, was Sie beschreiben, müssen Sie die Methode überschreiben, wenn Sie berücksichtigen, dass Ihre JPA-Annotation spezifische Informationen für die konkrete Klasse benötigt.

Mit JPA-Anmerkungen haben Sie tatsächlich zwei Optionen - Sie können die Methoden mit Anmerkungen versehen oder die Eigenschaften mit Anmerkungen versehen. In unserem Projekt haben wir die Annotation von Eigenschaften und nicht von Methoden standardisiert, aber dies wird Ihnen auch nicht weiterhelfen, da die Eigenschaften vermutlich Teil der konkreten Klasse sind. (Wenn sie in der Superklasse irgendwie geteilt werden, dann müssen Sie WIRKLICH die Methoden kommentieren und sie überschreiben).

Es ist schwer, eine Empfehlung abzugeben, ohne Ihr Schema zu sehen, aber wenn Ihre Entity-Klassen so viele Gemeinsamkeiten haben, dass sie viele Eigenschaften in der Super-Klasse teilen - könnten sie einfach in derselben Tabelle gespeichert werden, vielleicht mit a differenzierende Spalte?

Oder alternativ, wenn sie nicht fast identisch sind, könnten Sie nur die gemeinsamen Eigenschaften in jeder konkreten Klasse reproduzieren? Sie können sich mehr Arbeit ersparen als sich selbst zu retten, indem Sie versuchen, die allgemeinen Eigenschaften in der Superklasse zu erfassen. Da Sie sie in den konkreten Klassen einzeln annotieren müssen, deklarieren Sie sie einfach in den konkreten Klassen. Wenn Sie allgemeine Methoden benötigen, die mit diesen Eigenschaften interagieren, könnte eine separate Dienstprogrammklasse zur Erfassung dieser Funktionen die Antwort sein.

In unserem Projekt verwenden wir manchmal eine gemeinsame Superklasse für Entitäten, aber es erfasst einige Metadaten über die Entität - nichts, was die Persistenzlogik beeinflussen würde. Daher werden keine JPA-Annotationen in der abstrakten Klasse benötigt (noch würden sie einen Sinn ergeben).

+0

Danke für diese gut durchdachte Antwort. In meinem Fall sind die Entity-Klassen 50% ähnlich und 50% verschieden !! Ich werde weiterhin separate Tabellen für die Leistung verwenden und weiterhin den obigen Ansatz verwenden. Ich beschreibe auch die Accessor-Methoden, da manchmal (nicht oft) Logik in ihnen ist. – HDave

Verwandte Themen