Сущности составного шаблона с JPA

Рассмотрим следующую ситуацию: я использую составной шаблон для структуры, которую я хочу захватить с корнем из базы данных и которая реализует «каскадный интерфейс». Каскадная функция — это функция, которая выполняется сверху, но начинается с листья моего составного дерева, в то время как дети всегда дают текущее решение и родителям. Листы реализуют интерфейс иначе, чем узлы.

@Entity
public class Node implements Cascadable {

  @Id
  @GeneratedValue
  private Long id;

  @OneToMany
  private List<Cascadable> children;
}

Очевидно, это не работает, так как я даю эту сущность и атрибут, который является интерфейсом, а интерфейс не может быть сущностью. Я мог бы превратить интерфейс в абстрактный класс, сделать из него Entity и использовать с ним либо @Inheritance, либо @MappedSuperclass, хотя в этом случае я бы не смог расширить этот новый абстрактный класс своими листьями этого дерева, поскольку они используют идентификатор, который не генерируется. Есть ли альтернативы моему подходу? Оптимальным будет что-то вроде использования нескольких целевых объектов для дочернего атрибута или что-то в этом роде. Если каким-то образом можно отделить листья от остальной части дерева, но при этом сделать возможным, чтобы узлы знали, какие листья оно содержит, это была бы еще одна возможная альтернатива.

Проблема: при сохранении иерархической структуры в БД каждый узел должен знать своих дочерних элементов, листы работают иначе, чем остальные узлы.

Спасибо за помощь :)


person Jading    schedule 04.01.2018    source источник
comment
лет назад я делал что-то подобное, мы использовали MappedSuperclass для свойств базового узла.   -  person user902383    schedule 05.01.2018


Ответы (1)


Одно можно сказать наверняка: это никогда не будет работать с интерфейсами. Несколько несвязанных объектов, каждый с отдельной таблицей, могут реализовывать Cascadable, и JPA необходимо знать, к каким физическим таблицам применять ограничения. По той же причине не допускается использование нескольких целей ассоциации.

Если каким-то образом можно отделить листья от остальной части дерева

Что ж, решение этой проблемы обычное: предпочитать композицию наследованию. Звучит как хороший пример использования шаблона bridge, вы можете представить действие, которое должно быть выполнено, например, в форме «интеллектуального» перечисления. В качестве альтернативы, в зависимости от конкретного варианта использования, также может работать шаблон посетитель.

person crizzis    schedule 05.01.2018