2012-04-17 14 views
14

Czy program ormlite obsługuje trzy strategie dziedziczenia?Czy ormlite obsługuje dziedziczenie?

  • stół za klasowej hierarchii
  • stół za podklasy
  • stół za betonu klasy

znalazłem this discussion on the ORMLite user group, ale nie jestem pewien, że odpowiedzi na moje pytanie.

Szczególnie chcę używać "tabeli na hierarchię klas". Jeśli ich nie obsługuje framework ormlite, utworzę jedną klasę i zapomnę dziedziczenie, ale wolałbym dziedziczyć.

Odpowiedz

9

nie obsługuje tych opcji automatycznie, nie. Nie jestem pewien, że rzeczywiście przeczytać wątek jesteś powiązany, ponieważ jest to dość specyficzny temat:

Co potrzebne jest: Jeśli mam klasy A jako nadrzędnej i mam bezpośredni podklasy B i C i uruchamiam zapytanie dla wszystkich rekordów/obiektów klasy A, chcę, aby zwrócono wszystkie obiekty klasy A, B i C.

Tak, ORMLite tego nie robi i obecnie nie planuję go wspierać. Złożoność tego, o ile nie mylę się, jak to osiągnąć, wykracza poza to, co powiedziałbym "Lite". Sposób, w jaki Hibernate obsługuje takie konstrukcje, polega na posiadaniu kluczy obcych, wielu tabel i magicznych połączeń.

To pytanie daje jakieś pomysły dotyczące sposobu korzystania ORMLite zaimplementować dziedziczenie:

1) Można mieć klasę A i skojarzony tabelę - więc nie może być abstrakcyjne. Wtedy możesz mieć B i C, które podklasą A i mają wszystkie pola As, każda w osobnej tabeli. Następnie możesz utworzyć specjalne DAO dla A, które będzie również wyszukiwać dla B i C i dodać je do twoich wyników dla A.

2) Innym sposobem, aby to zrobić, może być uczynienie klas B i C podklasami nie będącymi ale zamiast tego mają obcy obiekt do A. Możesz następnie zapytać o cały As, a niektóre z nich to część B i część C, a niektóre tylko A. Możesz wtedy zapytać Bs i Cs i użyć A DAO do odśwież i uzyskaj pola A, których nie byłbyś w stanie rzucić. A może również zawierać wyliczenie, które mówi, czy to A, B, czy C. Możesz również zrobić magię, gdzie można powiedzieć getSubClassObject(), jeśli spojrzysz na enum i zapytasz B lub C dao o skojarzony obiekt z prawym kluczem obcym dla obiektu A.

+0

Przepraszam, może nie byłem wystarczająco jasny o linku. Pomyślałem, że może jest to już zaimplementowane rozwiązanie, ponieważ post jest od stycznia 2011 r., Ale dzięki za odpowiedź – Flow

+0

Np @Flow. To kolejne głosowanie na tę funkcję. Jeśli chcesz pomóc dodać go do ORMLite, wyślij wiadomość e-mail na listy mailingowe. – Gray

+0

Przykro mi to przywrócić, ale czy to oznacza, że ​​jeśli klasa B rozszerza klasę A, nie możesz mieć dwóch różnych tabel, w których klasa B używa właściwości klasy A jako kolumn tabeli B? – Maxrunner

32

ORMlite obsługuje dziedziczenie, ale nie obsługuje dziedziczenia-stratigies.

Poniżej znajduje się przykład dziedziczenia z ORMLite.

Załóż streszczenie nadklasą ów nie tabeli bazy danych ORMLite ale ma pewne pola bazy danych wykorzystywane przez wszystkie podklasy

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) utworzyć klasę, która dziedziczy ją i dodać kilka pól (ów Tabela bazy danych)

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

Nadzieję, że pomaga!

+2

Wielkie dzięki za dodanie tej odpowiedzi! Właśnie to chciałem zrobić. – theblang

+1

Jeśli masz inną klasę, która rozszerza Wydarzenie, powiedzmy Przykład. jak wyszukujesz zarówno Atividade, jak i Przykład? – Bri6ko

+0

@ Bri6ko: napisz ten numer jako nowe pytanie i odeślij to tutaj –