Puoi usare JPA con ereditarietà.
Esistono diverse varianti ("pattern"):
-
tutti gli oggetti condividono la stessa tabella e c'è una colonna / attributo "discriminante" (questo è il più vicino a quello che spieghi). È veloce per le query, ma avrai una colonna per ogni attributo di una sottoclasse (se hai 20.000 istanze e solo due istanze di una sottoclasse che definisce l'attributo "x", avrai 20.000 righe dove l'attributo "x" è implementato come una colonna nulla ed è più difficile da applicare che, quando l'istanza è della sottoclasse data, l'attributo non può essere nullo (è necessario un vincolo programmato).
-
ogni sottoclasse ha una sottoclasse diversa (buona se le sottoclassi hanno molti attributi diversi, ma implica join quando si interrogano sul DB).
-
una tabella è usata per attributi comuni, ci sono tabelle per attributi specifici per sottoclassi (questo è un ibrido tra gli altri due).
Il vantaggio è che è standard, e ti dimentichi di come mantenere / recuperare i dati, l'APP già lo fa per te.
Il disavantage è che si tratta di un'API completa e dovresti imparare come gestisce le relazioni (inclusi il caricamento a cascata e / o il caricamento lazy), JPQL / Criteria, ecc.