11
votes

Hibernate n'autorise pas un objet intégré avec un champ Int d'être nul?

Hibernate ne me permet pas de persister un objet contenant un objet NULL intégré avec un champ entier. Par exemple, si j'ai une classe appelée chose qui ressemble à ce xxx

où la partie est une classe intégrable qui ressemble à ce xxx

Ensuite, essayant de persister une chose d'un objet avec une pièce nulle provoque un hibernate de jeter une exception. En particulier, ce code xxx

provoque l'hibernate de jeter cette exception xxx

mon hypothèse est que cela se passe parce que cela se produit parce que cela se produit parce que cela se produit parce que cela se produit car une partie est une classe intégrée et donc partie.AA et partie.B sont simplement des colonnes dans la table de base de données. Depuis que la chose.Part est Null Hibernate veut définir les valeurs de la pièce.A et partie.b sur NULL pour la ligne pour la course.1. Cependant, Part.b est un entier et une hibernation ne permettront pas aux colonnes entières de la base de données d'être nulle. C'est ce qui provoque l'exception, non?

Je cherche donc des solutions de contournement pour ce problème. J'ai remarqué faire partie.B Un entier au lieu d'un Int semble fonctionner, mais pour des raisons pour lesquelles je ne vous ennuierai pas avec ce n'est pas une bonne option pour nous. Merci!


4 Réponses :


2
votes

Vous avez absolument raison de ce qui se passe. Lorsqu'un objet d'une classe intégrée est NULL, Hibernate y représente en faisant toutes ses colonnes nulle dans la base de données; Malheureusement, cela signifie que Hibernate ne peut pas dire la différence entre un objet NULL embeddable et un objet embourbé avec toutes les valeurs NULL.

Autant que je sache, si vous ne pouvez pas créer le champ nullable (en le faisant un entier , comme vous l'avez deviné), le seul moyen de créer un type d'hibernate personnalisé. Devrait être faisable, mais ce sera une douleur à le faire de cette façon. En fait, ce serait probablement pire que la raison pour laquelle vous ne pouvez pas utiliser un entier - alors quelle est cette raison, de toute façon?


0 commentaires

3
votes

Pas mal à l'aise, oui. Vous pouvez définir une valeur par défaut dans le champ partie : xxx

ou même xxx

(voir NULL Object Patern )

Gardez à l'esprit que si votre @ Embeddable Classe ne contient pas de primitive (qui a une valeur par défaut) et vous enregistrez un objet avec tous les null S, toute la structure sera persistée dans la base de données comme null , car il n'y a pas de moyen pour hiberner de faire la différence dans la DB si vous n'avez pas d'objet, ou si vous avez un vide vide. Pour contourner cela, s'il se produit, vous devez créer un champ factice ( booléen est le meilleur).


0 commentaires

9
votes

J'ai trouvé une autre solution de contournement et je pensais la partagerais. S'avère que si vous faites la colonne INT nullable, alors hibernate ne jette pas la propriétéValueException.

@Column(nullable = true)
public Integer b;


1 commentaires

Comment votre INT sera-t-il nul quand B est une primitive?



0
votes

Dans la mesure du possible, utilisez des cours d'enveloppe (entier, long, double ...): surtout, si vous devez faire une baldée sur une colonne ou 2 à une table existante. La boxe automatique est votre ami.


0 commentaires