Quando si progettano modelli di dati per JPA, qual è il modo migliore per utilizzare il polimorfismo?

2

Mi è stato chiesto di supportare un'applicazione Java EE. Il modello di dati era mal progettato e non supporterà molti casi d'uso necessari; quindi sto sviluppando un nuovo modello di dati usando EclipseLink (il vecchio è stato costruito su iBATIS). Intendiamoci, non sono un guru di EclipseLink e ho ancora molte domande sui modi migliori per utilizzarlo.

Ad esempio, l'applicazione corrente ha entità diverse per diversi tipi di richieste, ad esempio CakeRequest, PieRequest, DonutRequest, ecc. Il mio primo pensiero è stato quello di creare un tipo di richiesta base, quindi estenderlo con PieRequest, che può avere campi specifici, come crustType e hasCoolWhip. Certamente, EclipseLink può farlo.

Tuttavia, ho anche bisogno di elencare tutte le richieste, a partire dalla più recente. Non sono sicuro di quale sarebbe il modo migliore per gestirlo. Per ordinare le richieste insieme, devo essere in grado di mettere tutti i tipi di richieste in una singola raccolta, che sconfigge lo scopo del polimorfismo.

Potrebbe darsi che ci siano funzionalità di EclipseLink che potrebbero aiutarmi qui, funzionalità di cui non sono a conoscenza; o forse Java stesso potrebbe fornire la risposta. Qualcuno ha qualche suggerimento? Grazie mille!

    
posta Michael 06.05.2011 - 20:32
fonte

2 risposte

1

Non sono sicuro che questo soddisfi le tue esigenze. Per favore, fammi sapere se ho frainteso.

Se la data della richiesta è nella classe Request , perché non puoi avere una collezione di loro?

ArrayList<Request> requests;

// do some stuff

// Sort code
// ...
...request.get(i).getDate()...
//...

Questo non violerà minimamente l'incapsulamento. La data dovrebbe probabilmente far parte della richiesta, in quanto non è specifica per tipo.

    
risposta data 06.05.2011 - 21:14
fonte
1

L'uso di una sottoclasse di base come Request sembra una soluzione perfettamente ragionevole. Esito a chiamare una soluzione "corretta", poiché spesso non esiste un'unica soluzione corretta e conosco poco il tuo contesto specifico.

Non sono sicuro di come mettere tutti i tipi di richieste in una singola raccolta (usando la classe base come tipo) sconfigge lo scopo del polimorfismo; infatti sembrerebbe utilizzare uno degli aspetti chiave del polimorfismo, la sostituibilità.

PieRequest pieRequest = new PieRequest();
CakeRequest cakeRequest = new CakeRequest();
// and so on
List<Request> requests = new ArrayList<Request>;
requests.add(pieRequest);
requests.add(cakeRequest);
// and so on

for (Request request: requests) {
    doSomething(request.getDate());
    // etc.
}
    
risposta data 06.05.2011 - 22:04
fonte

Leggi altre domande sui tag