BigDecimal-Genauigkeit wurde bei JPA-Anmerkungen nicht beibehalten

8

Ich benutze die javax.persistence API und Hibernate, um Annotationen und persistente Entitäten und ihre Attribute in einer Oracle 11g Express-Datenbank zu erstellen.

Ich habe das folgende Attribut in einer Entität:

%Vor%

Das Ziel besteht darin, einen Dezimalwert mit maximal 12 Ziffern und maximal 9 dieser Ziffern rechts von der Dezimalstelle beizubehalten.

Nach der Berechnung von weightedScore lautet das Ergebnis 0,1234. Sobald ich jedoch die Entität mit der Oracle-Datenbank festlege, wird der Wert als 0.12 angezeigt.

Ich kann dies sehen, indem ich entweder ein EntityManager-Objekt verwende, um den Eintrag abzufragen, oder indem ich es direkt in der Oracle Application Express (Apex) -Schnittstelle in einem Webbrowser anschaue.

Wie sollte ich mein BigDecimal-Attribut annotieren, damit die Genauigkeit korrekt beibehalten wird?

Hinweis: Wir verwenden eine speicherinterne HSQL-Datenbank, um unsere Komponententests auszuführen, und es tritt das Problem nicht mit der fehlenden Genauigkeit auf, mit oder ohne die @Column Annotation.

Aktualisierung:

Wenn Sie die Tabellenbeschreibung betrachten, lautet die Definition der Spalte weightedScore NUMBER(19, 2) . Ich habe jetzt auch versucht, die Annotation in @Column(columnDefinition="Number(12, 9)") zu ändern, aber das hat keine Wirkung gehabt. Weiß jemand, warum Oracle auf diese Anmerkungen nicht reagiert?

    
David Kaczynski 08.06.2012, 21:07
quelle

2 Antworten

5

Ich habe die Antwort gefunden. Huzzah!

Ich habe versucht, die folgende Abfrage über die Oracle Apex-Schnittstelle auszuführen:

alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));

Ich habe einen Fehler erhalten, der besagt, dass eine Spalte mit Daten nicht so geändert werden kann, dass sie weniger genau oder weniger skaliert ist. Das war mein Problem!

Da ich versucht habe, Tabelle mit vorhandenen Daten zu ändern, musste ich entweder die Tabelle löschen und neu initialisieren oder die Spalte ändern, um nur mehr Präzision und Skalierung zu erhalten.

Ich habe die folgende Abfrage mit Erfolg versucht:

alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));

Der Grund dafür ist, dass ich rechts von der Dezimalstelle 7 Genauigkeitsstellen hinzufügen möchte, also addiere ich 7 zur Gesamtpräzision, um die Zunahme der Skala auszugleichen. Auf diese Weise kann die Spalte alle vorhandene Genauigkeit auf der linken Seite des Dezimaltrennzeichens beibehalten, während die Genauigkeit auf der rechten Seite hinzugefügt wird.

    
David Kaczynski 11.06.2012, 14:40
quelle
1

Es scheint, dass Sie nicht der einzige sind, der Probleme damit hat: Ссылка

    
siebz0r 09.06.2012 08:52
quelle