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
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que l'entité est inscrite dans votre fichier de configuration (persistence.xml, par exemple). De https://stackoverflow.com/a/14150629/116596
OriginalL'auteur Idris Mokhtarzada
Le problème est que, vous obtenez une liste de Un et Hibernate ne sais pas assez pour créer des B ou C dans une liste basée sur le régulateur de la formule. Heureusement, il y a une annotation.
Certaines personnes appellent cela un bug, et je suis une sorte de tendance à être d'accord. En tout cas, l'abstraction semble être un peu baveur.
Ajouter un
@ForceDiscriminator
annotation à l'entité mère (A
) et il est probable qu'il fonctionne correctement.Cette solution est mise en veille prolongée-spécifique. Je ne sais pas si le problème s'étend à la JPA en général ou si il y a une JPA solution.
EDIT:
Cela ne semble pas avoir fait le tour.
Il pourrait être intéressant d'essayer d'obtenir le sql que hibernate génère pour vous.
Ajouter
à votre hibernate config et voir ce qui se passe.
L'obtention de ce sql avec et sans la force de la clause pourrait donner des indices à exactement ce que la force fait et pourquoi il ne fonctionne pas.
Je ne peux pas penser à autre chose pour le moment, à l'exception de la
NULL
dans votre discriminateur de formule semble un peu risqué.OriginalL'auteur Don Roby
Bien, cela m'a fait curieux: il est peut-être souffrez-vous d'une ce problème qui dit:
Pouvez-vous essayer d'appliquer TRIM() sur le résultat (à l'intérieur de la
@DiscriminatorFormula
) ou de tester avec un autre SGBD? Cela ne semble pas être spécifique d'Hibernate.OriginalL'auteur mabi
Je l'ai résolu en utilisant la DTYPE colonne et la clause where.
Avec votre exemple, il serait:
OriginalL'auteur javaboygo