【问题标题】:Hibernate not links entities to GenericHibernate 不将实体链接到 Generic
【发布时间】:2019-05-30 13:16:40
【问题描述】:

我有课程模板:

@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;
    }
}

正如我们所见,我决定使用泛型。我得到了例外:

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

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

【问题讨论】:

  • 你可以使用List&lt; AbstractField &gt; fields
  • 我试过了,结果还是一样的异常。
  • org.hibernate.AnnotationException:使用 OneToMany 或 ManyToMany 定位未映射的类
  • 没看到你有两个不同的表,请看下面我的回答。

标签: java hibernate


【解决方案1】:

子类不能使用不同的表。 Check this comment why

你可以做的是定义单表继承类型:

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

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

然后你可以在Template类中使用List&lt;AbstractField&gt; fields

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多