代码之家  ›  专栏  ›  技术社区  ›  Seth

Hibernate映射中的2级继承存在问题

  •  4
  • Seth  · 技术社区  · 15 年前

    这是我的班级结构:

    class A
    class B extends A
    class C extends A
    class D extends C
    class E extends C
    

    下面是我的映射(为了简洁起见省略了类体):

    甲级:

    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @MappedSuperclass
    @DiscriminatorColumn(
            name="className",
            discriminatorType=DiscriminatorType.STRING
    )
    @ForceDiscriminator
    public abstract class A
    

    乙类:

    @Entity
    @DiscriminatorValue("B")
    public class B extends A
    

    C类:

    @Entity
    @DiscriminatorValue("C")
    @MappedSuperclass
    @DiscriminatorColumn(
            name="cType",
            discriminatorType=DiscriminatorType.STRING
    )
    @ForceDiscriminator
    public abstract class C extends A
    

    D类:

    @Entity
    @DiscriminatorValue("D")
    public class D extends C
    

    E类:

    @Entity
    @DiscriminatorValue("E")
    public class E extends C
    

    我有一个F类包含一组a:

    @Entity
    public class F
    {
        ...
    
        @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
        @JoinTable(
                name="F_A",
                joinColumns = @JoinColumn(name="A_ID"),
                inverseJoinColumns = @JoinColumn(name="F_ID")
        )
        private Set<A> aSet = new HashSet<A>();
    
        ...
    

    问题是,每当我向ASET添加一个新的E实例,然后调用 session.saveOrUpdate(fInstance) ,Hibernate以“A”作为鉴别字符串保存。当我试图访问F实例中的ASET时,我得到以下异常(为了简洁起见,建议使用完整的stacktrace):

    org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A
    

    我是否错误地映射了类?我应该如何映射多个继承级别?

    谢谢你的帮助!

    1 回复  |  直到 15 年前
        1
  •  3
  •   Seth    15 年前

    我找到了一个解决方案,所以我想我会把它贴在这里,以防其他人遇到这个问题。

    结果是C类上的额外注释导致了这个问题。当我摆脱了实体之外的所有东西,让所有其他类保持原样(使用适当的鉴别器值)时,一切都正常工作。

    @Entity
    public class C extends A
    ...