2009-10-14 5 views
3

J'utilise Hiberbnate 3.1.3. J'ai un mappage comme ci-dessous et quand j'essaie d'insérer un enregistrement dans le TEST_TABLE, j'obtiens une exception: 'Exception dans le fil "principal" org.hibernate.exception.SQLGrammarException: impossible d'extraire la valeur initiale pour le générateur d'incrément'Hibernate: Générateur d'ID en utilisant increment et Oracle Schema

<class name="com.test.app.to.TestTable" table="TEST_TABLE" schema="TEST"> 
     <id name="testId" type="long"> 
      <column name="TEST_ID" precision="12" scale="0" /> 
      <generator class="increment"></generator> 
     </id> 
</class> 

J'ai le schéma par défaut défini comme ci-dessous dans le fichier cfg.xml car j'ai besoin d'utiliser aussi des tables de OTHER_SCHEMA dans mon application.

<property name="hibernate.default_schema">OTHER_SCHEMA</property> 

Dans le cas ci-dessus, il semble être un bug Hibernate comme une lecture à l'aide d'un objet TestTable fonctionne très bien et utilise correctement le schéma « TEST », mais le '<generator class="increment"></generator>' ne pas utiliser le schéma « TEST » mais utilise la par défaut 'OTHER_SCHEMA' pour obtenir l'identifiant maximum. La requête générée pour ID max lit comme suit:

Hibernate: select max(TEST_ID) from OTHER_SCHEMA.TEST_TABLE 

Je ne suis pas en mesure de spécifier un schéma pour le générateur et il n'utilise pas le schéma = attribut « TEST » de la classe que j'attendre à utiliser .

Comment ce problème peut-il être résolu?

Répondre

7

Vous pouvez spécifier le schéma pour votre générateur à l'aide schéma paramètre:

<generator class="increment"> 
    <param name="schema">TEST</param> 
</generator> 

Malheureusement, ce n'est pas bien décrite dans la documentation Hibernate; vous devez regarder le API javadoc afin de le découvrir. Cela dit, Mark a raison de dire que "increment" n'est pas très efficace - il n'est pas sûr non plus dans un environnement de cluster.

+0

Cela m'a beaucoup aidé. Merci. – ozeray

0

Si le schéma par défaut de mise en veille prolongée est OTHER_SCHEMA alors si vous ne fournissez pas un schéma d'une table, alors il ajoutera automatiquement la valeur par défaut

Solution est que vous devez ajouter un schéma pour tous les noms de table, sauf une valeur par défaut. Dans ce cas, il vaut mieux que vous définissiez la valeur par défaut d'hibernation sur votre schéma.

En regardant la séquence en utilisant max (id) comme cela n'est généralement pas efficace, en particulier dans Oracle qui a des séquences exactement pour cette utilisation.

+0

Merci Mark. Je vais regarder en utilisant la séquence à long terme pour rendre l'application robuste. Ajouter un schéma en tant que paramètre est un correctif simple qui clarifie le fait qu'il ne s'agit pas d'un bogue Hibernate et qui me permet d'utiliser la logique voulue dans une petite application. – Krishna

Questions connexes