Domanda

Il seguente è un JPA annotata tipo gerarchia, in cui tutti i campi di dati (e getter e setter associati) sono membri del supertipo con i metodi astratti di attuazione logica aziendale. Ci sono un certo numero di sottotipi che implementano questi metodi astratti, senza l'aggiunta di membri di dati, quindi usiamo strategia di ereditarietà singola tabella in modo che abbiamo bisogno di una sola tabella nel database per eseguire questa gerarchia tipo.

L'ho fatto in questo modo perché, in base al contenuto dei dati, ci sono diversi comportamenti che devono essere attuati per raggiungere un obiettivo finale.

@Entity
@Table
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class SuperEntity {
  // Several fields and getters and setters
  ...
  // Abstract method declarations for business logic
  ...
}

@Entity
@DiscriminatorValue("some value")
public class SomeSubtype extends SuperEntity {
  // Implementations of abstract methods
  ...
}

Si tratta di una perversione del concetto di colonna discriminatore in JPA / Hibernate?

Un collega afferma che, poiché la struttura dei dati non varia da sottotipo sottotipo, i metodi astratti e implementazioni corrispondenti dovrebbero essere spostati in una sorta di approccio modello di strategia. È la sua idea migliore?

È stato utile?

Soluzione

Una migliore è estremamente soggettiva. Suona come la composizione e le strategie sono una valida alternativa, e che potrebbe impedire la necessità di mappare un altro soggetto per ogni implementazione della logica di business.

JPA e hibernate a parte, ogni libro progettazione OO che abbia mai letto inizia con "composizione favore per l'eredità" per la condivisione di comportamento.

Supponiamo che tu fossi un oggetto di dati, potrebbe non condividere l'oggetto tra ogni strategia non hibernate e operare su quello? Avere meno JPA / Hibernate è facile per gli occhi, in ogni caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top