2012-04-17 2 views
14

ormlite supporta queste tre strategie di ereditarietà?Ormite supporta l'ereditarietà?

  • tabella per gerarchia di classi
  • tabella per ogni sottoclasse tavolo
  • per classe concreta

ho trovato this discussion on the ORMLite user group, ma io non sono sicuro che risponde alla mia domanda.

In particolare, desidero utilizzare "tabella per gerarchia di classi". Se il loro non è il supporto del framework ormlite, farò una classe e dimenticherò l'ereditarietà, ma preferirei usare l'ereditarietà.

risposta

9

ORMLite non supporta questi automaticamente, no. Io non sono sicuro che in realtà leggere il thread si è collegato al perché è abbastanza preciso su di esso:

cosa ho bisogno è: Se ho classe A come una superclasse, e ho sottoclassi B diretta e C e eseguo una query per tutti i record/oggetti di classe A, desidero che vengano restituiti tutti gli oggetti di classe A, B e C.

Sì, ORMLite non lo fa e attualmente non ho intenzione di supportarlo. La complessità di questo, a meno che non mi sbagli su come ottenerlo, è al di fuori di quello che direi "Lite". Il modo in cui Hibernate supporta tali costrutti consiste nell'avere chiavi esterne, tabelle multiple e join magici.

Tale questione dà alcune idee su come utilizzare ORMLite per implementare l'ereditarietà:

1) Si potrebbe avere classe A e di una tabella associata - quindi non può essere astratta. Quindi potresti avere B e C quale sottoclasse A e avere tutti i campi As ciascuno in una tabella separata. È quindi possibile creare un DAO speciale per una che sarebbe anche interrogare per la B e C e aggiungerli nei vostri risultati per A.

2) Un altro modo per farlo è che si potrebbe fare classi B e C non essere sottoclassi ma invece hai un oggetto estraneo ad A. Puoi quindi interrogare tutti gli As e alcuni di loro sarebbero B's A part e alcuni C's A part e alcuni solo A. Potresti quindi interrogare Bs e Cs e usare A DAO per Aggiorna e ottieni i campi A che non potresti lanciare. A potrebbe anche avere una sorta di enum che diceva se era un A, B o C. Potresti anche fare un po 'di magia dove potresti dire getSubClassObject(), se guardi l'enum e chiedi a B o C dao per il oggetto associato con la chiave esterna corretta per l'oggetto A.

+0

Spiacente, forse non ero abbastanza chiaro sul collegamento. Ho pensato che forse il loro è ora una soluzione implementata per questo, perché il post è da gennaio 2011, ma grazie per la tua risposta – Flow

+0

Np @Flow. Questo è un altro voto per quella funzione. Se vuoi contribuire ad aggiungerlo a ORMLite, invia un messaggio di posta elettronica nelle mailing list. – Gray

+0

Siamo spiacenti di riportarlo indietro, ma questo significa che se la Classe B estende la Classe A, non puoi avere due tabelle diverse, dove la Classe B usa le proprietà di Classe A come colonne della tabella B? – Maxrunner

32

ORMlite supporta l'ereditarietà ma non supporta le strativie di ereditarietà.

Di seguito è riportato un esempio di Ereditarietà con ORMLite.

creare un superclasse astratta non thats una tabella di database ORMLite ma ha alcuni campi del database utilizzati da tutte le sottoclassi

public abstract class Event { 

    @DatabaseField(columnName="id", generatedId = true) 
    protected int _id; 

    @DatabaseField(columnName="name") 
    protected String name; 

    @DatabaseField(columnName="date") 
    protected Date date; 

    @DatabaseField(columnName="type") 
    protected String type; 

    public abstract void setName(String name); 
    public abstract void setDate(Date date); 
    public abstract void setType(String type); 
} 

2) creare una classe che eredita e aggiungere alcuni campi (questo è una tabella database)

@DatabaseTable(tableName="atividade") 
public class Atividade extends Event { 

     @DatabaseField(columnName="ala") 
     protected String ala; 

     public String getAla() { 
       return ala; 
     } 

     public void setAla(String ala) { 
       this.ala = ala; 
     } 

     public Atividade(String name, Date date, String type, String ala) { 
       this.setName(name); 
       this.setDate(date); 
       this.setTipo(type); 
       this.setAla(ala); 
     } 

     Atividade(){ 
     } 

     @Override 
     public void setName(String name) { 
       this.name = name; 
     } 

     @Override 
     public void setDate(Date date) { 
       this.date = date; 
     } 

     @Override 
     public void setType(String type) { 
       this.type = type; 
     } 
} 

Spero che questo aiuti!

+2

Grazie mille per aver aggiunto questa risposta! Questo è esattamente quello che volevo fare. – theblang

+1

Se si ha un'altra classe che estende l'evento, diciamo Esempio. come si fa a interrogare sia per Atividade che per l'Esempio? – Bri6ko

+0

@ Bri6ko: scrivi questo numero come una nuova domanda e riferiscilo qui –