这是我的班级结构:
class A
class B extends A
class C extends A
class D extends C
class E extends C
这是我的映射(为了简洁省略了类体):
A类:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@MappedSuperclass
@DiscriminatorColumn(
name="className",
discriminatorType=DiscriminatorType.STRING
)
@ForceDiscriminator
public abstract class A
B组:
@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
我有一个包含一组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>();
...
问题在于每当我向aSet添加一个新的E实例然后调用session.saveOrUpdate(fInstance)
时,hibernate会以“A”作为辨别器字符串进行保存。当我尝试访问F实例中的aSet时,我得到以下异常(为简洁起见省略了完整的堆栈跟踪):
org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A
我是否错误地映射了这些类?我该如何映射多层继承?
感谢您的帮助!
答案 0 :(得分:3)
我找到了一个解决方案,所以我想我会在这里发布,以防其他人遇到这个问题。
事实证明,C类的额外注释导致了问题。当我摆脱除了实体之外的所有东西并将它们放在所有其他类中时(使用适当的鉴别器值),一切正常。
@Entity
public class C extends A
...