Hibernate 映射中 2 级继承的问题

Set*_*eth 5 java hibernate hibernate-annotations

这是我的班级结构:

class A
class B extends A
class C extends A
class D extends C
class E extends C
Run Code Online (Sandbox Code Playgroud)

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

A类:

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

B类:

@Entity
@DiscriminatorValue("B")
public class B extends A
Run Code Online (Sandbox Code Playgroud)

C类:

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

D类:

@Entity
@DiscriminatorValue("D")
public class D extends C
Run Code Online (Sandbox Code Playgroud)

E类:

@Entity
@DiscriminatorValue("E")
public class E extends C
Run Code Online (Sandbox Code Playgroud)

我有一个包含一组 A 的 F 类:

@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>();

    ...
Run Code Online (Sandbox Code Playgroud)

问题是,每当我向 aSet 添加一个新的 E 实例然后调用 时session.saveOrUpdate(fInstance),hibernate 都会使用“A”作为鉴别符字符串进行保存。当我尝试访问 F 实例中的 aSet 时,出现以下异常(为简洁起见,省略了完整的堆栈跟踪):

org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A
Run Code Online (Sandbox Code Playgroud)

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

谢谢您的帮助!

Set*_*eth 5

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

事实证明,C 类上的额外注释导致了这个问题。当我摆脱除实体之外的所有内容并将所有其他类保留原样(具有适当的鉴别器值)时,一切正常。

@Entity
public class C extends A
...
Run Code Online (Sandbox Code Playgroud)