J'utilise Hibernate pour accéder à une DB héritée. Pour certaines tables, l'intégrité de référence parent-enfant n'est pas appliquée et la valeur Je veux toujours utiliser ces relations dans Quelles sont mes options? p> Long code> 0 est utilisée à la place de NULL pour certaines colonnes "parent" dans des tables d'enfant pour désigner "no parent". P>
@manytoone code> et
@Eonetomany cod> champs, mais obtenir
entrouvertNotfound code> Erreur car la valeur 0 ne correspond pas à n'importe quel enregistrement dans la table principale. P>
3 Réponses :
Vous pouvez le mapper sur Le Puisque je ne connais pas votre modèle de données fournissant un exemple valide est délicat. Essayez avec: p> bloc. P> Si cela ne convient pas à vos besoins, vous pouvez vous écrire posséder chargeur de requêtes p> Si vous utilisez certains Sorte de journalisation Activez la propriété java.lang.long code> quelle valeur par défaut est null. Ou vous pouvez utiliser un
@pospostload code> et null IT si
0 code>. Vous pouvez également utiliser un
@formula code> et ignorer
0 code>.
@formula code> comme écrit dans leur documentation peut être utilisé pour
Conditions de jointure Code >. P>
show_sql code>. Et ajouter à votre configuration
org.hibernate.sql code>
débogage code>. P> p>
@Formula nécessite une expression SQL valide. Pouvez-vous fournir l'expression pour remplacer 0 par null?
Les champs de cartographie à Java.Lang.Long n'est pas ce dont j'ai besoin. J'ai besoin de ces champs mappés sur la classe d'entité comme @manytoone.
Je ne peux tout simplement pas faire de Joincolumnorformula Travailler. J'ai placé un rapport de bogue ici hibernate.onjira.com/browse/hhh-6811 . Je vais essayer l'annotation de chargeur si je manque d'autres options.
Activer le journal et coller le SQL
Utilisez le voir tout code>
annotation:
Cela contempla mon problème. Mais je veux toujours que Hibernate fige l'intégrité de référence pour toutes les valeurs de clé non nulle.
Hibernate ne force pas l'intégrité de référence. La base de données fait. Il faudrait exister une contrainte de clé étrangère, mais cela est bien sûr impossible en raison de ces lignes de qualité. L'hibernate ne sera pas en mesure d'appliquer de manière magique l'intégrité référentielle que même la base de données est incapable d'appliquer. Si vous mappez cette colonne en tant qu'association, je ne vois pas comment créer une valeur non nulle pointant sur rien, cependant.
Il s'agit d'une DB héritée avec un schéma non-documenté et ces références sont maintenues par un logiciel propriétaire. Tout ce que je sais pour le moment, c'est que 0 valeurs sont autorisées comme des clés à la place des nulls habituels. Je suppose que l'intégrité de référence existe toujours pour ces relations et est maintenue par le logiciel exclusif, mais je veux être signalé immédiatement si mon hypothèse est fausse.
Comme je l'ai dit, si vous stockez un parent existant chez votre enfant, Hibernate utilisera bien sûr l'ID parent pour renseigner la colonne. Donc, je ne vois pas comment vous pourriez casser l'intégrité référentielle.
Le logiciel propriétaire, pas moi, peut potentiellement casser le code. Je soupçonne que cela puisque je ne sais pas pourquoi les auteurs ont décidé de ne pas forcer l'intégrité de référence pour certaines colonnes. BTW, j'ai essayé d'ajouter l'annotation @notfound, mais il semble que Hibernate l'ignore (dans la méthode d'annotationbinder.Processelesselementnotations ()). Peut-être que les annotations hibernées, par opposition aux annotations JPA, doivent être explicitement activées?
Donc, vous voudriez que Hibernate se jette une exception pour toutes les valeurs incorrectes sauf 0. Est-ce correct? Si oui, je n'ai pas de réponse. Mais cela ressemble à une exigence étrange pour moi. Pourquoi ne pas corriger le logiciel de buggy?
Oui, tu me fais bien, je veux hibernate jeter une exception. Le logiciel mentionné provient d'une grande entreprise de logiciels, il n'y a pas de code source et je soupçonne que les auteurs y pensent comme une fonctionnalité, mais pas un bug de toute façon. L'annotation @notfound a également été ignorée en silence car la classe Notfound n'a pas été trouvée dans mon environnement.
Vous pouvez également omettre des incohérences de données si un objet avec ID est manquant (+1 car est une bonne solution à votre problème)
@Vladimir Comment avez-vous surmonté cette question? Je dois résoudre un type de problème similaire d'un code hérité pour persister un enregistrement dans la table enfant avec valeur 0 au lieu de NULL lorsque aucun parent n'existe.
@malware je n'ai pas :-(
au lieu de @JOINCOLUN pourrait être utilisé @joinformula. Comme ceci l'expression signifie que nous vérifions la colonne et si c'est 0 retour null. Puis hibernate ne recherche pas l'entité associée. P> p>