2012-04-17 9 views
14

Unterstützt Ormlite diese drei Vererbungsstrategien?Unterstützt ormlite Vererbung?

  • Tabelle pro Klassenhierarchie
  • Tabelle pro Unterklasse
  • Tabelle pro Betonklasse

Ich fand this discussion on the ORMLite user group, aber ich bin nicht sicher, ob es meine Frage beantwortet.

Speziell ich möchte "Tabelle pro Klassenhierarchie" verwenden. Wenn sie nicht vom ormlite-Framework unterstützt werden, mache ich eine Klasse und vergesse die Vererbung, aber ich würde lieber die Vererbung verwenden.

Antwort

9

ORMLite unterstützt diese nicht automatisch, nein. Ich bin nicht sicher, ob Sie tatsächlich den Faden Sie im Zusammenhang lesen, weil es ganz spezifischen Informationen:

Was ich brauche, ist: Wenn ich Klasse A als übergeordnete Klasse habe, und ich habe direkte Unterklassen B und C , und ich führe eine Abfrage für alle Datensätze/Objekte der Klasse A, ich möchte alle Objekte der Klasse A, B und C zurückgegeben haben.

Ja, ORMLite tut dies nicht und derzeit habe ich keine Pläne, es zu unterstützen. Die Komplexität davon, wenn ich mich nicht irre, ist, was ich sagen würde, war "Lite". Die Art, wie Hibernate solche Konstrukte unterstützt, besteht darin, Fremdschlüssel, mehrere Tabellen und magische Joins zu verwenden.

Diese Frage gibt einige Ideen, wie ORMLite verwenden Vererbung zu implementieren:

1) Sie könnten Klasse A haben und eine zugehörige Tabelle - so kann es nicht abstrakt sein. Dann könnten Sie B und C haben, die Unterklasse A und alle Felder As in einer separaten Tabelle haben. Sie könnten dann ein spezielles DAO für A erstellen, das auch nach B und C abfragt und sie in Ihre Ergebnisse für A einfügt.

2) Eine andere Möglichkeit wäre, die Klassen B und C nicht Unterklassen zu machen aber stattdessen ein fremdes Objekt zu A. Sie können dann alle As abfragen und einige von ihnen wären B's A-Teil und einige C's A-Teil und einige nur A. Sie könnten dann auch Bs und Cs abfragen und das A DAO verwenden Aktualisiere und erhalte die Felder von A, die du nicht schreiben könntest. A könnte auch eine Art enum haben, die besagt, ob es ein A, B oder C ist. Sie könnten auch etwas Zauberei machen, wo Sie getSubClassObject() sagen könnten, wenn Sie die enum betrachten und das B oder C dao für die verknüpftes Objekt mit dem richtigen Fremdschlüssel für das A-Objekt.

+0

Sorry, vielleicht war ich nicht klar genug über den Link. Ich dachte, vielleicht ist das jetzt eine implementierte Lösung dafür, denn die Post ist ab Januar 2011, aber danke für deine Antwort – Flow

+0

Np @Flow. Das ist eine andere Wahl für dieses Feature. Wenn Sie helfen möchten, ORMLite hinzuzufügen, senden Sie einige E-Mails in den Mailinglisten. – Gray

+0

Es tut uns leid, dies zurück zu bringen, aber bedeutet das, dass, wenn Klasse B die Klasse A erweitert, Sie nicht zwei verschiedene Tabellen haben können, wobei Klasse B Klasse A Eigenschaften als Tabelle B Spalten verwendet? – Maxrunner

32

ORMlite unterstützt die Vererbung, aber es unterstützt keine Vererbungsstrategien.

Im Folgenden finden Sie ein Beispiel für die Vererbung mit ORMLite.

erstellen eine abstrakte Superklasse das ist nicht eine ORMLite Datenbanktabelle hat aber einige Datenbankfelder von allen Unterklassen verwendet

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) Erstellen Sie eine Klasse, die es erbt und fügen Sie einige Felder (das ist eine Datenbanktabelle)

@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; 
     } 
} 

Hoffe, dass hilft!

+2

Vielen Dank für das Hinzufügen dieser Antwort! Genau das wollte ich tun. – theblang

+1

Wenn Sie eine andere Klasse haben, die das Ereignis erweitert, sagen wir Beispiel. Wie fragen Sie nach Atividade und Example? – Bri6ko

+0

@ Bri6ko: schreibe dieses Problem als neue Frage und verweise es hier –