Поддерживает ли 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;
}
}
Надеюсь, что это поможет!