2010-05-19 124 views
4

这里是我的阶级结构:问题与Hibernate映射2级继承

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 

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 

我有一个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>(); 

    ... 

问题是,每当我添加一个新的E实例到一个集合然后调用session.saveOrUpdate(fInstance),休眠时用“A”作为歧视字符串保存。当我尝试访问ASET的F情况下,我得到下面的异常(全堆栈跟踪ommitted为了简洁):

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

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

感谢您的帮助!

+1

不能说它是否真的与你的问题有关,但是在同一个类中有@Entity和@MappedSuperclass是一个错误。 – Affe 2010-05-19 22:03:38

回答

3

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

事实证明,C类的额外注释导致了这个问题。当我摆脱了除实体以外的所有其他类,并按照它们的方式(使用适当的鉴别值)离开所有其他类时,一切正常。

@Entity 
public class C extends A 
...