Java Hibernate不会将实体链接到泛型

Java Hibernate不会将实体链接到泛型,java,hibernate,Java,Hibernate,我有一个类模板: @Entity @Table(name = "templates") public class Template extends AbstractEntity { private List<AbstractField> fields; } 如我们所见,我们有一个字段的抽象类(复选框、单选按钮等)&所有字段都扩展了这个抽象字段,如下所示: @Entity @Table(name = "field_checkbox") @Setter @ToString @

我有一个类模板:

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

    private List<AbstractField> fields;
}
如我们所见,我们有一个字段的抽象类(复选框、单选按钮等)&所有字段都扩展了这个抽象字段,如下所示:

@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;
    }
}
@实体
@表(name=“上诉模板”)
公共类模板扩展了抽象实体{
私有列表字段;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“template”)
公共列表getFields(){
返回字段;
}
}
正如我们看到的,我决定用泛型。我得到一个例外:


原因:org.hibernate.AnnotationException:属性 ru.model.representation.appeal.template.template.fields具有未绑定的 类型,并且没有显式的目标实体。解决此通用用法问题 或者设置一个显式的目标属性(例如@OneToMany(target=),或者使用 显式@Type


据我所知,Hibernate不允许映射到泛型。但我计划存储许多类型的字段,扩展的AbstractField。该怎么办?

不可能为子类使用不同的表

您可以定义单表继承类型:

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

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

然后你可以在
模板
类中使用
列表字段

你可以使用
列表字段
我尝试过,结果是相同的exception.org.hibernate.AnnotationException:使用一个omany或多个omany来定位一个未映射的类没有看到你有两个不同的表,请参阅下面我的答案。
@Entity
@Table(name = "fields")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class AbstractField extends AbstractEntity {

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