2010-05-19 126 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 
...