Hibernate не связывает сущности с Generic - PullRequest
0 голосов

У меня есть шаблон класса:

@Entity
@Table(name = "templates")
public class Template extends AbstractEntity {

    private List<AbstractField> fields;
}

Он состоит из полей, и я получаю любые подобные викторины.

У меня есть сущности, которые наследуют AbstractField:

@Setter
@MappedSuperclass
public abstract class AbstractField extends AbstractEntity {

    private FieldType fieldType;
    private String title;
    private Template template;
}

Как мы видим, у нас есть абстрактный класс полей (флажок, переключатель и т. Д.), И все поля расширяют это абстрактное поле, как показано ниже:

@Entity
@Table(name = "field_checkbox")
@Setter
@ToString
@EqualsAndHashCode(callSuper = true)
public class CheckBoxField extends AbstractField {

    private Boolean selection = false;
}

Мне нужно связать поля с однимзависимость от многих.Я сделал это следующим образом:

@Entity
@Table(name = "appeal_templates")
public class Template<F extends AbstractField> extends AbstractEntity {

    private List<F> fields;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "template")
    public List<F> getFields() {
        return fields;
    }
}

Как мы видим, я решил сделать это с помощью generic.И я получаю исключение:

Причина: org.hibernate.AnnotationException: свойство ru.model.representation.appeal.template.Template.fields имеет несвязанный тип и не имеет явной целевой сущности.Решите эту проблему общего использования или установите явный целевой атрибут (например, @OneToMany (target =)) или используйте явный @ Type

Как я понимаю, Hibernate не позволяет сопоставить с универсальным. Но я планируюхранить много типов полей, расширенных AbstractField. Что делать?

1 Ответ

1 голос
/ 30 мая 2019

Невозможно сделать разные таблицы для подклассов. Проверьте этот комментарий, почему

Что вы можете сделать, это определить тип наследования одной таблицы:

@Entity
@Table(name = "fields")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class AbstractField extends AbstractEntity {

    private FieldType fieldType;
    private String title;
    private Template template;
}

И тогда вы можете использовать List<AbstractField> fields в Template классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...