Рассмотрим следующую ситуацию: я использую составной шаблон для структуры, которую я хочу захватить с корнем из базы данных и которая реализует «каскадный интерфейс». Каскадная функция — это функция, которая выполняется сверху, но начинается с листья моего составного дерева, в то время как дети всегда дают текущее решение и родителям. Листы реализуют интерфейс иначе, чем узлы.
@Entity
public class Node implements Cascadable {
@Id
@GeneratedValue
private Long id;
@OneToMany
private List<Cascadable> children;
}
Очевидно, это не работает, так как я даю эту сущность и атрибут, который является интерфейсом, а интерфейс не может быть сущностью. Я мог бы превратить интерфейс в абстрактный класс, сделать из него Entity и использовать с ним либо @Inheritance, либо @MappedSuperclass, хотя в этом случае я бы не смог расширить этот новый абстрактный класс своими листьями этого дерева, поскольку они используют идентификатор, который не генерируется. Есть ли альтернативы моему подходу? Оптимальным будет что-то вроде использования нескольких целевых объектов для дочернего атрибута или что-то в этом роде. Если каким-то образом можно отделить листья от остальной части дерева, но при этом сделать возможным, чтобы узлы знали, какие листья оно содержит, это была бы еще одна возможная альтернатива.
Проблема: при сохранении иерархической структуры в БД каждый узел должен знать своих дочерних элементов, листы работают иначе, чем остальные узлы.
Спасибо за помощь :)
MappedSuperclass
для свойств базового узла. - person user902383   schedule 05.01.2018