Будьте в спящем режиме полиморфизм

Если вы видите эти отчеты с устройств под управлением Android Lollipop, пожалуйста, игнорируйте их. Это, вероятно, происходит всякий раз, когда что-то запускает действие, которое использует WebView, в то время как пакет WebView находится в процессе обновления в Play Store (что в настоящее время может происходить только в Lollipop). Во время обновлений пакеты считаются не установленными менеджером пакетов. То есть в вашем приложении нет ничего плохого. Временное окно, в котором обновленный пакет считается несуществующим, обычно невелико, поэтому, когда приложение перезапускается после такого сбоя, оно запускается нормально.

12
задан Nicktar 19 January 2016 в 11:25
поделиться

2 ответа

Это абсолютно возможно. Вы можете связать заметки с абстрактным классом 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 должен помочь вам начать работу.

В основном, ваши варианты:

  • Сохранение всего в одной таблице и использование столбца дискриминатора, чтобы узнать, какая строка какого типа
  • Хранение каждого конкретного класса (Apple и Orange) в отдельной таблице
  • Наличие общей таблицы Fruit со столбцом дискриминатора и таблиц Apple и Orange с внешним ключом к таблице Fruit

Другое редактирование: Заметил, что это спящий режим, а не вопрос JPA. Однако особой разницы не имеет, поскольку варианты те же. Вот соответствующий раздел в документации Hibernate .

15
ответ дан 2 December 2019 в 18:20
поделиться

Этот шаблон очень распространен в слоях данных на основе 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. Пока фактическое поле фруктов не загружено, его тип не определен.

Надеюсь, это ответит на некоторые из ваших вопросов.

5
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: