2009-08-14 5 views
3

Ich entwickle eine Anwendung mit Oracle 11g, Java (Struts2) und Hibernate.Oracle Hibernate Sequenzgenerator Problem

Ich habe eine Tabelle namens mytemp mit Spalte mytemp_id vom Typ NUMBER (22,0).

In meiner mytemp.hbm.xml Datei-ID wird wie unten

gegeben
<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> 

In meiner Oracle-Datenbank-Sequenz namens "MYTEMP_TEMP_ID_SEQ" erstellt und arbeitet in Oracle in Ordnung.

Jetzt, wenn ich versuche Datensatz mit Hilfe von Hibernate einzufügen, gibt es mir folgende Fehler

org.hibernate.id.IdentifierGenerationException: Diese ID-Generator erzeugt lange, integer, kurze oder String

Es scheint, Wenn meine Sequenz Number zurückgibt, hibenate sie als BigDecimal, während die Sequence-Generatorklasse des Hibernate Werte berücksichtigt, die long, integer, short und nur string sind.

Hibernate sollte kein Problem mit BigDecimal haben. Aber ich denke, sie haben nicht BigDecimal für Sequenzgenerator implementiert

Kann mir jemand helfen, das Problem zu lösen?

Danke.

Antwort

13

Um ehrlich zu sein, kann ich mir nicht vorstellen, warum Sie darauf bestehen, Ihre ID als BigDecimal anstelle von lang zu haben. Der maximale Long-Wert ist 9,223,372,036,854,775,807, der, obwohl zugegebenermaßen ungefähr ein Tausendstel des maximalen NUMBER (22) -Werts ist, wirklich sein sollte, ziemlich genug. Wenn Sie eine Million Kennzeichnungen jede Sekunde erzeugen würden, müssten Sie das für 300.000 Jahre tun, um Ihre Reihenfolge zu erschöpfen.

Um Ihren Identifikator als BigDecimal generieren zu lassen, müssen Sie Ihren eigenen Generator schreiben. Sie können dies tun, indem Sie den integrierten Sequenzergenerator von Hibernate erweitern und seine Methode generate() überschreiben. Anstatt IdentifierGeneratorFactory.get() aufzurufen, die nur long/int/short/String unterstützt, erhalten Sie Ihren Sequenzwert aus dem Ergebnissatz als BigDecimal.

Sie werden dann durch die Angabe seiner vollständigen Klassennamen zu declare your generator benötigen:

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

Hallo ChssPly76, Vielen Dank für Ihre Antwort. Ich konvertierte meinen Ruhezustand, um lange zu verwenden, wo auch immer es BigDecimal gibt, um die Sequenz im Ruhezustand zu verwenden. Es löst mein Problem. Ich postete es hier um zu wissen, wie ich Hibernate Identifiergenerator Klasse erweitern kann, BigDecimal für Sequenzgenerator zu verwenden. Ich bekomme es nicht genau. Aber das Konvertieren von BigDecimal in Long löst das Problem sicher. Danke. – amar4kintu

+0

Ich habe erklärt, wie man 'SequenceGenerator' in meiner obigen Antwort erweitert. Schauen Sie sich die 'generate()' Methode an - Sie würden im Prinzip das Ganze kopieren und 'IdentifierGeneratorFactory.get()' durch 'resultSet.get()' ersetzen, um Ihren 'BigDecimal' Wert zu erhalten. – ChssPly76

+0

Ich habe alle meine big_decimal Felder in meiner Hibernate-Generierungsdatei als so lange betrachtet .. so funktioniert es jetzt .. Danke .. für Ihre Unterstützung .. – amar4kintu

2

Haben Sie den richtigen Dialekt eingestellt? Das sollte ausreichen, um Hibernate das Ergebnis der Sequenz verständlich zu machen.

[EDIT] Das Problem ist, dass der Typ Ihrer Sequenz nicht mit dem Typ Ihrer Spalte übereinstimmt. Die Sequenz (gemäß der Hibernate-Fehlermeldung) kann in Long, Integer, Short oder String umgewandelt werden, während Ihre Sequenz ein BigDecimal zurückgibt.

Ich empfehle, den Typ der ID-Spalte als "lang" anzugeben, obwohl Oracle diesen Typ nicht kennt. Intern sollte Hibernate dann in der Lage sein, für jeden richtig zu casten.

+0

.. Folgende ist mein Dialekt org.hibernate.dialect.Oracle10gDialect amar4kintu

+0

In diesem Fall wird die Art Ihrer ID-Spalte ist das Problem. Sieh dir meine Änderungen an. –

2

Auf jeden Fall. Eine lange ID muss ausreichen, wobei immer die Anzahl der eindeutigen Datensätze berücksichtigt werden muss.Der spezielle Generator, der nur spezielle Werte haben könnte, könnte anders als ganzzahlig Typ sein oder die Ganzzahl Typ Werte aus irgendeinem Grund haben (könnte projektspezifisch sein).

Auch Generator ist datenbankspezifisch wie Sequenz für Oracle, so Dialact-Definition ist auch wichtig. ja