Hibernate: org.mise en veille prolongée.WrongClassException, SINGLE_TABLE héritage et DiscriminatorFormula

Je suis en utilisant Hibernate 3.2.2 GA avec HSQLDB 2.0 GA, et j'ai une classe de la hiérarchie semblable à la suivante:

@Entity
@Table(name = "A_TABLE")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula(value = "case when CODE IN (1, 2, 3, 4) then 'TypeB' 
when CODE   IN (5, 6, 7, 8) then 'TypeC' else NULL end")
@org.hibernate.annotations.Entity(dynamicUpdate = true, dynamicInsert = true)
public abstract class A{

 (...)

}


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

(...)

}


@Entity
@DiscriminatorValue("TypeC")
public class C extends A {

(...)

}

Je suis en train d'exécuter la requête HQL suivante, ce qui renvoie d'objets de B et C classes.

String hql = "from A a where a.someAttr = 3";
Query query = session.createQuery(hql);

return query.list();

Cependant, j'obtiens l'erreur suivante:

org.hibernate.WrongClassException: Object with id: 2 was not of the specified subclass: A (Discriminator: C      )

La chose la plus étrange est que l'objet avec l'id 2 est un C...

J'ai googlé pour cette erreur et j'ai trouvé quelques personnes qui ont fait face, aucune aide InheritanceType.SINGLE_TABLE et DiscrimatorFormula, cependant. Quelqu'un a rencontré ce problème?

J'ai été par le biais de ce. Si vous le pouvez, attacher un débogueur au Hibernate Loader ou SingleTableEntityPersister classe. Ce dernier est le stockage de l'effectif de sous-classes dans le domaine subclassesByDiscriminatorValue. Vérifiez les clés, et de comparer ce qui s'est réellement passé là-bas. Votre entrée ressemble étrangement rembourré avec des espaces blancs.

OriginalL'auteur Porcho | 2011-04-14