Oracle-hibernate-Sequenz-generator problem
Ich entwickle eine Anwendung mit oracle 11g, Java(struts2) und Hibernate.
Ich habe die Tabelle mit dem Namen mytemp mit Spalte mytemp_id die den Typ NUMBER(22,0).
In meinem mytemp.hbm.xml Datei-id ist wie unten angegeben
<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 mit dem Namen "MYTEMP_TEMP_ID_SEQ" wird erstellt und die Ordnung, die in Oracle.
Nun, wenn ich versuche, einfügen Datensatz mit hibernate, gibt es mir folgenden Fehler
org.hibernate.id.IdentifierGenerationException: diese id generator generiert long, integer, short oder string
Scheint es, als meine Reihenfolge gibt Anzahl, hibenate wenn man es als BigDecimal, während hibernate - sequece generator-Klasse in Anbetracht der Werte, die sind long, integer, short und string nur.
Überwintern, sollten Sie nicht haben problem mit BigDecimal. Aber ich denke, Sie haben nicht umgesetzt BigDecimal für Sequenz-generator
Kann einer mir helfen, der Lösung des Problems?
Dank.
InformationsquelleAutor amar4kintu | 2009-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um ehrlich zu sein, ich kann mir nicht vorstellen, warum Sie darauf bestehen, dass Ihre ID als BigDecimal anstelle von long. Maximaler long-Wert ist
9,223,372,036,854,775,807
, die zwar zugegebenermaßen ist etwa ein Tausendstel der maximalen ANZAHL(22) Wert, sollte wirklich genug. Wenn Sie wurden zu generieren Millionen Bezeichner jeder zweite, Sie hätte zu tun, dass für 300.000 Jahren, um die Abgase Ihrer Sequenz.Sagte, dass, um Ihre Bezeichner generiert, wie BigDecimal, müssen Sie schreiben Sie Ihren eigenen generator. Sie können tun, dass durch die Erweiterung Hibernate integrierten SequenceGenerator und überschreiben seine
generate()
Methode. Anstelle von aufrufen durchIdentifierGeneratorFactory.get()
unterstützt nur long /int /short /String, den Sie möchte erhalten Sie Ihre Sequenz mit dem Wert aus dem ResultSet als BigDecimal.Müssen Sie dann erklären Sie Ihre generator durch Angabe seiner vollständigen Klassennamen:
Ich habe erklärt, wie erweitern
SequenceGenerator
in meiner Antwort oben. Werfen Sie einen Blick auf seinegenerate()
Methode -, dass Sie im Grunde kopieren würden die ganze Sache, und ersetzen SieIdentifierGeneratorFactory.get()
mitresultSet.get()
zu erhalten, IhreBigDecimal
Wert.Ich setze alle meine big_decimal Felder berücksichtigt werden, wie lange in meinem hibernate-Datei generation.. also es funktioniert jetzt.. danke.. für Eure Unterstützung..
InformationsquelleAutor ChssPly76
Haben Sie den richtigen Dialekt? Das sollte genug sein, um den Ruhezustand zu verstehen, das Ergebnis der Sequenz.
[EDIT] Das problem ist, dass die Art der Sequenz entspricht nicht der Art Ihrer Spalte. Die Sequenz (pro Hibernate-Fehlermeldung) umgewandelt werden kann long, integer, short oder string, während Ihre Sequenz gibt einen BigDecimal.
Schlage ich vor, geben Sie den Typ der ID-Spalte als "lange" auch wenn Oracle das nicht weiß, Art. Intern, Hibernate sollten dann in der Lage zu werfen für alle alles richtig.
In diesem Fall, die Art der ID-Spalte ist das problem. Siehe meine edits.
InformationsquelleAutor Aaron Digulla
Definitiv. Lange id muss genug sein, immer unter Berücksichtigung der Anzahl eindeutiger Datensätze zu generieren. Die speziellen generator bloße spezielle Werte werden möglicherweise andere als integer Art oder die Kontrolle über den integer geben Sie Werte für einige Grund(vielleicht werden Projekt-spezifisch).
Auch generator ist eine bestimmte Datenbank wie Sequenz, die für oracle, so dialact definition nicht egal auch.
InformationsquelleAutor Yuvaraj V