Comment obtenir le DiscriminatorValue au moment de l'exécution
Nous avons les classes suivantes
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //optional annotation as this is default
@DiscriminatorColumn(name = "apType", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("AP")
public class ApplicationProcess {
}
Et ce
@Entity
@DiscriminatorValue("APS")
public class ApplicationProcessScheme extends ApplicationProcess {
}
Maintenant, j'ai besoin de savoir au moment de l'exécution si le ApplicationProcess
est de DiscriminatorValue
AP or APS
.
Puisque c'est géré automatiquement par jpa, je n'ai aucun moyen d'obtenir cette valeur.
Nous faisons appel à une méthode qui prend un ApplicationProcess
comme paramètre, et je veux éviter d'utiliser instanceof
pour vérifier de quel type il est. Serait mieux si je pouvais faire quelque chose comme
applicationProcess.getApType().equals("AP");
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mapper vos discriminateur comme une propriété en lecture seule:
instanceof
(je pense). Je vais peut-être besoin de cela.apType
vous pouvez le configurer pour@Transient
et définissez sa valeur dans le constructeur:apType = getClass().getAnnotation(DiscriminatorValue.class).value()
Je peux imaginer les quelques cas où il pourrait être utile, mais en dépit de la raison pour laquelle vous avez besoin de cela, vous pouvez créer sur votre résumé de la méthode de classe comme
@OneToMany
relations, comme le pays pourraient être utilisées dans un@Entity Address
, mais d'autres types peuvent uniquement être utilisés par l'interrogation de la base de données. Donc: la classe de base serait de gérer la plupart des types, mais un peu de celles qui sont spécifiques à leur propre classe dérivée.@DiscriminatorValue
annotation.Je ne pense pas qu'il serait plus frais, ce qui semble pire que d'appeler
instanceOf
pour moi: si, pour quelque raison que ce soit vous modifiez le discriminateur de valeur, il serait briser votre code.Si vous avez besoin de vérifier le type, l'utilisation
instanceOf
. Une astuce en utilisant le régulateur ne va pas rendre les choses plus agréables, il serait juste de rendre votre code plus robuste.if(not applicationProcess instanceof ApplicationProcessScheme)
, parce que je ne peut pas vérifier contre ApplicationProcess depuis ApplicationProcessScheme serait également correspondre à de Sorte que le code seraitif(obj instanceof ApplicationProcessScheme) {//because there is no !instanceof} else { //We have a child!}
Vous pouvez utiliser la Formule d'Annotation.
Si vous êtes en utilisant Hibernate, vous pouvez utiliser le code ci-dessous en fonction de ce lien:
Bien sûr, vous serait en mesure de l'utiliser dans vos requêtes.
J'ai utilisé la solution suivante pour obtenir cette valeur lors de l'exécution, en supposant que vous ne savez pas à l'avance quelle est l'héritage de type:
Vous devez changer le type de
clazz_
selon votrediscriminatorType
annotations (Entier est la valeur par défaut pour l'union et rejoindre les stratégies). Cette solution peut être utilisée pourSINGLE_TABLE
aussi, si vous ajoutez un tel cas; ou vous pouvez utiliser les autres solutions mentionnées ici.Je viens de tomber sur cette question et avait pour poster une réponse. IMO c'est clair cas pour l'utilisation de Java API reflection