Проблема с 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

Класс Б:

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

Класс С:

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

Класс Д:

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

Класс Е:

@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 в aSet, а затем вызываю session.saveOrUpdate(fInstance), спящий режим сохраняется с «A» в качестве строки дискриминатора. Когда я пытаюсь получить доступ к aSet в экземпляре F, я получаю следующее исключение (полная трассировка стека для краткости опущена):

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

Я неправильно сопоставляю классы? Как я должен отображать несколько уровней наследования?

Спасибо за помощь!


person Seth    schedule 19.05.2010    source источник
comment
Не могу сказать, действительно ли это связано с вашей проблемой, но наличие @Entity и @MappedSuperclass в одном классе является ошибкой.   -  person Affe    schedule 20.05.2010


Ответы (1)


Я нашел решение, поэтому, думаю, я опубликую его здесь, если кто-то еще столкнется с этой проблемой.

Оказывается, проблему вызывали дополнительные аннотации к классу C. Когда я избавился от всего, кроме сущности, и оставил все остальные классы такими, какие они были (с соответствующими значениями дискриминатора), все заработало правильно.

@Entity
public class C extends A
...
person Seth    schedule 20.05.2010