Поддерживает ли ormlite поддержку наследования?

Поддерживает ли ormlite эти три стратегии наследования?

  • таблица для иерархии классов
  • таблица для каждого подкласса
  • таблица для конкретного класса

Я нашел эту дискуссию в группе пользователей ORMLite, но я не уверен, что она отвечает на мой вопрос.

В частности, я хочу использовать "таблицу для иерархии классов". Если они не поддерживают структуру ormlite, я сделаю один класс и забуду наследование, но я бы предпочел использовать наследование.

Ответы

Ответ 1

ORMLite не поддерживает эти автоматически, нет. Я не уверен, что вы действительно прочитали тему, с которой вы связались, потому что она довольно специфична:

Что мне нужно: если у меня есть класс A как суперкласс, и у меня есть прямые подклассы B и C, и я запускаю запрос для всех записей/объектов класса A, я хочу иметь все объекты класса A, B и C.

Да, ORMLite этого не делает, и в настоящее время я не планирую его поддерживать. Сложность этого, если я не ошибаюсь в том, как это сделать, лежит за пределами того, что я бы сказал, "Lite". Способ, которым Hibernate поддерживает такие конструкции, заключается в наличии внешних ключей, нескольких таблиц и магии.

Этот вопрос дает некоторые идеи о том, как использовать ORMLite для реализации наследования:

1) У вас может быть класс A и связанная таблица, поэтому он не может быть абстрактным. Тогда вы могли бы иметь B и C, какой подкласс A и иметь все поля As в отдельной таблице. Затем вы можете создать специальный DAO для A, который также запросит B и C и добавит их в ваши результаты для A.

2) Еще один способ сделать это: вы можете сделать классы B и C не подклассами, а вместо этого иметь посторонний объект для A. Затем вы можете запросить все As, и некоторые из них будут частью BA и некоторой частью CA а некоторые просто A. Затем вы также можете запросить Bs и Cs и использовать A DAO для обновления и получить поля A, которые вы не сможете использовать. А также может иметь какое-то перечисление, в котором говорилось, было ли это A, B или C. Вы также можете сделать магию, где бы вы могли сказать getSubClassObject(), если бы посмотрели на перечисление и запросили B или C dao для связанный объект с правым внешним ключом для объекта A.

Ответ 2

ORMlite поддерживает наследование, но не поддерживает наследования-стратиграфии.

Ниже приведен пример Inheritance с ORMLite.

Создайте абстрактный суперкласс, который не является таблицей базы данных ORMLite но имеет некоторые поля базы данных, используемые всеми подклассами

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) Создайте класс, который наследует его, и добавьте некоторые поля (это Таблица базы данных)

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

Надеюсь, что это поможет!