2010-02-03 15 views
14

Ho un numero di superclassi astratte da cui la mia classe concreta eredita vari metodi. Alcuni di questi metodi devono avere annotazioni JPA o JAXB posizionate su di essi nella classe concreta. Attualmente lo faccio tramite il seguente:Il modo migliore per aggiungere annotazioni ai metodi ereditati

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

C'è un modo per farlo senza sovrascrivere il metodo? Sembra un tale spreco sovrascrivere un metodo solo per fornire annotazioni locali.

+0

Inoltre, volevo aggiungere che il motivo per cui avevo bisogno di creare annotazioni nelle sottoclassi concrete in primo luogo era perché usano nomi di tabelle differenti in JPA e nomi di elementi in JAXB. La superclasse in questo caso è anche generica. – HDave

risposta

9

Sfortunatamente, non c'è un modo migliore di quello che state facendo ora. Per fare ciò che stai descrivendo dovrai sovrascrivere il metodo, considerando che la tua annotazione JPA avrà bisogno di informazioni specifiche per la classe concreta.

Con le annotazioni JPA, in realtà sono disponibili due opzioni: è possibile annotare i metodi oppure annotare le proprietà. Nel nostro progetto ci siamo standardizzati sull'annotazione delle proprietà piuttosto che sui metodi, ma questo non vi aiuterà neanche, poiché le proprietà sono presumibilmente parte della classe concreta. (Se sono in qualche modo condivisi nella super-classe, allora DAVVERO sarà necessario annotare i metodi e sovrascriverli).

È difficile fare una raccomandazione senza vedere il tuo schema, ma se le tue classi di entità hanno così tanto in comune che condividono molte proprietà nella super-classe - potrebbero semplicemente essere memorizzate nella stessa tabella, magari con un colonna di tipo di differenziazione?

In alternativa se sono non quasi identico, potresti semplicemente riprodurre le proprietà comuni in ogni classe di calcestruzzo? Potresti essere tu stesso a causare più lavoro invece di salvarti cercando di catturare le proprietà comuni nella super classe. Dal momento che dovrai annotarli individualmente nelle lezioni concrete, basta dichiararli nelle lezioni concrete. Se hai bisogno di metodi comuni che interagiscono con queste proprietà, una risposta può essere una classe Utility separata per acquisire tali funzioni.

Nel nostro progetto, a volte utilizziamo una super classe comune per le entità, ma acquisisce alcuni metadati sull'entità, nulla che possa influire sulla logica di persistenza. Pertanto, non sono necessarie annotazioni JPA (né avrebbero senso) nella classe astratta.

+0

Grazie per questo ben pensato attraverso la risposta. Nel mio caso, le classi di entità sono simili al 50% e al 50% diverse !! Continuerò a utilizzare tabelle separate per le prestazioni e continuerò a utilizzare l'approccio sopra. Di solito annoto i metodi di accesso anche se talvolta (non spesso) abbiamo una logica in essi. – HDave

Problemi correlati