Question

Je développe une application à l'aide 11g Oracle, Java (struts2) et Hibernate.

Je table nommée MonTemp avec mytemp_id colonne qui est de type NUMBER (22,0).

Dans mon id fichier mytemp.hbm.xml est comme donnés ci-dessous

<id name="mytempId" type="big_decimal">
        <column name="MYTEMP_ID" precision="22" scale="0" />
        <generator class="sequence">
            <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
        </generator>
    </id>

Dans ma séquence de base de données Oracle nommée « MYTEMP_TEMP_ID_SEQ » est créé et fonctionne très bien dans Oracle.

Maintenant, quand je tente d'insérer l'enregistrement à l'aide mise en veille prolongée, il me donne l'erreur suivante

org.hibernate.id.IdentifierGenerationException: ce générateur d'id génère long, entier, chaîne courte ou

Il semble que ma séquence retourne le nombre, hibenate considérant comme BigDecimal, alors que la classe de générateur de sequece de mise en veille prolongée compte tenu des valeurs qui sont longues, entier, à court et chaîne uniquement.

Mise en veille prolongée ne devrait pas avoir de problème avec BigDecimal. Mais je pense qu'ils ne sont pas mis en œuvre pour BigDecimal générateur de séquences

Quelqu'un peut-il me aider à résoudre le problème?

Merci.

Était-ce utile?

La solution

Pour être honnête avec vous, je ne peux pas imaginer pourquoi vous insister pour avoir votre carte d'identité comme BigDecimal au lieu de long. valeur à long maximale est 9,223,372,036,854,775,807 qui, bien est certes environ un millième de la valeur Nombre maximum (22), devrait vraiment être assez . Si vous deviez générer un millions identifiants chaque seconde , vous devez le faire pour 300000 années afin d'épuiser votre séquence.

Cela dit, afin d'avoir votre identifiant généré comme BigDecimal vous devez écrire votre propre générateur. Vous pouvez le faire en élargissant le SequenceGenerator intégré de mise en veille prolongée et en remplaçant sa méthode generate(). Au lieu d'appeler à travers IdentifierGeneratorFactory.get() qui ne supporte que long / int / short / chaîne que vous souhaitez obtenir votre valeur de séquence de jeu de résultats BigDecimal.

Vous devrez alors déclarer votre générateur en spécifiant son nom complet de la classe:

<generator class="com.mypackage.BigDecimalGenerator">
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>

Autres conseils

Avez-vous réglé la Dialect correcte? Cela devrait être suffisant pour faire comprendre Hibernate le résultat de la séquence.

[EDIT] Le problème est que le type de votre séquence ne correspond pas au type de votre colonne. La séquence (selon le message d'erreur de mise en veille prolongée) peut être converti en long, entier, à court ou une chaîne pendant que votre séquence retourne un BigDecimal.

Je suggère de préciser le type de la colonne ID comme « long », même si Oracle ne sait pas ce type. En interne, Hibernate devrait alors être en mesure de jeter tout correctement pour tout le monde.

Certainement. Long ID doit être un nombre suffisant en tenant toujours compte des enregistrements uniques qu'il peut générer. Le générateur particulier simple d'avoir des valeurs particulières pourrait être autre que entier type ou d'avoir le contrôle sur la entier valeurs de type pour une raison quelconque (peut-être projet spécifique).

En outre, le générateur est spécifique de base de données comme séquence pour Oracle, si la définition dialact est importante aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top