7
votes

Poignée hibernée longue 0 Valeur au lieu de NULL dans les relations de plusieursTone

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 Long 0 est utilisée à la place de NULL pour certaines colonnes "parent" dans des tables d'enfant pour désigner "no parent".

Je veux toujours utiliser ces relations dans @manytoone et @Eonetomany champs, mais obtenir entrouvertNotfound Erreur car la valeur 0 ne correspond pas à n'importe quel enregistrement dans la table principale.

Quelles sont mes options?


0 commentaires

3 Réponses :


0
votes

Vous pouvez le mapper sur java.lang.long quelle valeur par défaut est null. Ou vous pouvez utiliser un @pospostload et null IT si 0 . Vous pouvez également utiliser un @formula et ignorer 0 .

Le @formula comme écrit dans leur documentation peut être utilisé pour Conditions de jointure .

Puisque je ne connais pas votre modèle de données fournissant un exemple valide est délicat. Essayez avec: xxx

bloc.

Si cela ne convient pas à vos besoins, vous pouvez vous écrire posséder chargeur de requêtes

Si vous utilisez certains Sorte de journalisation Activez la propriété show_sql . Et ajouter à votre configuration org.hibernate.sql débogage .


4 commentaires

@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



9
votes

Utilisez le tout annotation: xxx

voir http://docs.jboss.org/hibernate/core/3.6/Reference/fus/html_single/#mapping-Declaration-mantoone


10 commentaires

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 :-(



1
votes

au lieu de @JOINCOLUN pourrait être utilisé @joinformula. Comme ceci xxx

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.


0 commentaires