Если вы видите эти отчеты с устройств под управлением Android Lollipop, пожалуйста, игнорируйте их. Это, вероятно, происходит всякий раз, когда что-то запускает действие, которое использует WebView, в то время как пакет WebView находится в процессе обновления в Play Store (что в настоящее время может происходить только в Lollipop). Во время обновлений пакеты считаются не установленными менеджером пакетов. То есть в вашем приложении нет ничего плохого. Временное окно, в котором обновленный пакет считается несуществующим, обычно невелико, поэтому, когда приложение перезапускается после такого сбоя, оно запускается нормально.
Это абсолютно возможно. Вы можете связать заметки с абстрактным классом Fruit
вместо того, чтобы повторять их в каждой из реализаций:
@Entity
@Inheritance
public abstract class Fruit {
private Set<Note> notes;
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "fruit")
public Set<Note> getNotes() {
return notes;
}
}
@Entity
public class Apple extends Fruit {
...
}
@Entity
public class Orange extends Fruit {
...
}
@Entity
public class Note {
private String theNote;
@ManyToOne
private Fruit fruit;
...
}
Ét voilà!
- Добавление на основе комментария: JPA предоставляет несколько стратегий для работы с наследованием. Соответствующий раздел в руководстве по Java EE должен помочь вам начать работу.
В основном, ваши варианты:
Другое редактирование: Заметил, что это спящий режим, а не вопрос JPA. Однако особой разницы не имеет, поскольку варианты те же. Вот соответствующий раздел в документации Hibernate .
Этот шаблон очень распространен в слоях данных на основе Hibernate. Как это работает внутри, во многом зависит от того, какая стратегия наследования используется.
При использовании наследования по таблице для класса или по таблице для каждого подкласса, будет создана таблица для каждого подкласса / класса. Например, в вашем случае у вас будет таблица Fruit и две таблицы Apple
и Orange
со ссылками на внешние ключи между Fruit и Apple / Orange. При запросе одного фрукта (будь то яблоко или апельсин) по идентификатору, Hibernate соединит таблицу Fruit с таблицей Apple и Orange. Каждая строка будет преобразована в Apple или Orange в зависимости от того, из какой таблицы были извлечены поля.
Другая возможность - использовать дискриминаторы. Будет использоваться одна таблица Fruit
, которая будет содержать поле дискриминатора (напр. fruit_type
принимает значения яблоко
и апельсин
). В зависимости от значения этого поля Hibernate определит, является ли соответствующий объект яблоком или апельсином.
В вашем случае, в случае активной загрузки, когда Hibernate загружает объект Note, он будет охотно извлекать соответствующие Fruit и заполните фруктовое поле экземпляром Apple или Orange соответственно.
В случае отложенной выборки фруктовое поле будет прокси, реализующим интерфейс Fruit. Пока фактическое поле фруктов не загружено, его тип не определен.
Надеюсь, это ответит на некоторые из ваших вопросов.
В вашем случае, в случае активной загрузки, когда Hibernate загружает объект Note, он охотно извлекает соответствующий Fruit и заполняет поле Fruit экземпляром Apple или Orange соответственно.
В случае ленивой загрузки , фруктовое поле будет прокси, реализующим интерфейс Fruit. Пока фактическое поле фруктов не загружено, его тип не определен.
Надеюсь, это ответит на некоторые из ваших вопросов.
В вашем случае, в случае активной загрузки, когда Hibernate загружает объект Note, он охотно извлекает соответствующий Fruit и заполняет поле Fruit экземпляром Apple или Orange соответственно.
В случае ленивой загрузки , фруктовое поле будет прокси, реализующим интерфейс Fruit. Пока фактическое поле фруктов не загружено, его тип не определен.
Надеюсь, это ответит на некоторые из ваших вопросов.