J'ai une difficulté à cartographier un attribut intégré d'une classe. J'ai créé des classes similaires à ce que j'essaie de faire pour illustrer. Fondamentalement, j'ai une hiérarchie de classe @MedDable qui utilise l'héritage. La classe de niveau supérieur "Numéro de pièce" n'a qu'un attribut, et les classes d'extension n'ajoutent aucun attribut à la classe "Numéro de pièce", ils ne font qu'ajouter une certaine validation / logique.
Voici ce que je veux dire: p> PartNumber strong> p> Chevy PartNumber strong> p> public class ChevyPartNumber extends PartNumber {
/**
* Chevy Part Number is formatted as 1234-$1234
*
* @param partNumber
*/
public ChevyPartNumber(String partNumber) {
super(partNumber);
validate(partNumber);
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#validate(java.lang.String)
*/
@Override
public boolean validate(String partNumber) {
// do some validation
return true;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getGeneralPartNumber()
*/
@Override
public String getGeneralPartNumber() {
return partNumber;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getSpecificPartNumber()
*/
@Override
public String getSpecificPartNumber() {
return partNumber;
}
}
6 Réponses :
hmm, pas sûr. Avez-vous essayé de mettre @mapsuperclasson mustnumber et @Meddable sur les sous-classes. Voir aussi - https://forum.hibernate.org/viewtopic.php?t=966129 p>
comme nœud latéral - avez-vous envisagé d'utiliser un validateur Hibernate au lieu de la méthode de validation de la maison cultivée? P>
Nice appel. Je suis curieux de découvrir les sous-classes, étant donné que la configuration ne les mentionne pas et que la JVM ne vous permet pas de les découvrir.
Que voulez-vous dire avec "JVM ne vous permet pas de les découvrir"?
@skaffman - Je pense que vous devez déplacer la balise @Equassée à la classe des parents et utiliser le @mapsuperclass ... éventuellement?
À quoi il ressemble d'essayer de faire est d'utiliser "l'héritage intégré" que je ne crois pas encore les supports hibernés.
@Embeddable public PartNumber getPartNumber() { return partNumber; } @Transient public SpecificPartNumber getSpecificPartNumber() { return PartNumberFactory.create( getPartNumber() ); }
J'ai un problème similaire dans mon propre schéma, alors ce que j'ai eu pour le moment, c'est comme ça:
Classe parent: P>
@Embedded @AttributeOverrides( { @AttributeOverride(name="city", column = @Column(name="fld_city") ), @AttributeOverride(name="nationality.iso2", column = @Column(name="nat_Iso2") ), @AttributeOverride(name="nationality.name", column = @Column(name="nat_CountryName") ) //nationality columns in homeAddress are overridden } ) Address homeAddress;
Composant (E.G. @EMedDable) L'héritage n'est pas pris en charge et ne sera probablement jamais. Il y a une bonne raison pour que l'identifiant d'entité joue un rôle essentiel dans toutes les stratégies d'héritage soutenues par Hibernate et les composants n'ont pas d'identifiants (mappés).
Vous avez trois choix: p>
a) Carte Parnumber (et tous ses descendants) en tant qu'entités. La norme peut rester abstraite: p> b) en fonction de votre exemple, il semble que tous les descendants de plusieurs numéros diffèrent uniquement de comportement (ils n'introduisent aucune nouvelle propriété à stocker). Si tel est bien le cas, vous pouvez mapper les propriétés de PARNUMBER PLUS VOTRE VALEUR DE DISCRIMINATEUR (Donc, vous savez quelle classe à instancier) en tant que propriété privée @Enbeddeded et avoir des accessoires d'obtention / SetPartNumber () dans les sous-classes appropriées de la classe. Vous pouvez même écrire votre propre type personnalisé Hibernate pour faire cela pour vous (c'est assez simple). P> c) Si les descendants de la norme diffèrent des propriétés qui doivent être stockées et les cartographier en tant qu'entités sont inacceptables pour tout Raison, vous pouvez utiliser Marshall / Motemarshall à la chaîne (comme XML ou autre chose qui correspond à la facture) et stockez cela. J'utilise Xtream pour ce but exact et j'ai écrit un simple type d'hibernate pour y aller. Votre cartographie de la pièce ressemblerait à quelque chose comme p> et les descendants de la norme ne devront pas être cartographiés du tout. Bien entendu, l'inconvénient est que la gestion du XML dans la base de données est un peu plus tracas, ce qui pourrait ne pas être l'approche idéale pour quelque chose que vous auriez potentiellement besoin de faire rapport. OTOH, j'utilise ceci pour stocker des paramètres de plug-in et je me suis enregistré
Pour B, connaissez-vous de bons tutoriels pour le marshalling / désactivez les sous-classes appropriées à l'aide d'un type d'hibernate personnalisé?
Il vous suffit de mettre en œuvre l'interface USERTYPE de Hibernate - c'est assez simple. Voici un exemple de Hibernate Docs: ( hibernate.org/172.html ). Dans votre cas, vous retourneriez la méthode de la norme de "RetourdClass ()" et instantiez de manière dynamique la classe de descendance appropriée dans "NullSafeget ()" basée sur une valeur que vous stockez dans une colonne (et obtenez-vous de ResultSet).
Comme il est mentionné dans d'autres réponses, il semble que Hibernate ne supporte pas l'héritage des embagments (au moins, je n'ai pas réussi à le faire fonctionner). J'ai mangé quelques solutions de contournement (merci à CHSSPLY76 pour l'inspiration):
1) Remplacez 2) Introduisez la classe d'entité intermédiaire qui reflète pleinement la structure de la table de base de données. Et puis sur la carte avec vos classes de modèle de domaine (et votre dos) manuellement. Cette approche fournit une flexibilité extrême au prix du travail manuel pour écrire et tester le code de cartographie. P> 3) Store pour ma tâche, j'ai choisi une troisième approche. J'utilise Types Hibernate pour sérialiser des objets dans JSON et stocker le résultat dans Le JSON résultant dans la base de données sera ressemblant à p> @embadable code> par
@entity code> et stockez
PARNBLE code > Hiérarchie dans une table dédiée. Bien sûr, il nécessite
@onetoone code> de la relation avec la classe Composite (
partie code>). P>
Partnumber code> Descendants sous forme sérialisée et comptez sur le sérialisateur qui doit pouvoir être capable. instancier la bonne classe pendant la désérialisation. P>
JSONB code>
colonne du postgreSQL. Les types d'hibernate utilisent Jackson sous le capot de sorte que toutes ses annotations (y compris celles qui contrôlent le comportement polymorphe) sont à votre disposition. Dans votre code d'affaire serait comme ceci: p>
Eclipselink prend en charge l'héritage dans les embedddisables via @Customizer http://wiki.eclipse.org/eclipselink/serguide/ JPA / BASIC_JPA_Développement / entités / Incordice # Héritage P>