2012-06-08 9 views
8

Ich verwende die javax.persistence-API und Hibernate, um Annotationen und persistente Entitäten und ihre Attribute in einer Oracle 11g Express-Datenbank zu erstellen.BigDecimal-Genauigkeit nicht beibehalten mit JPA-Annotationen

Ich habe das folgende Attribut in einer Einheit:

@Column(precision = 12, scale = 9) 
private BigDecimal weightedScore; 

Das Ziel ist es, ein Dezimalwert mit maximal 12 Ziffern und maximal 9 dieser Ziffern rechts von der Dezimalstelle zu beharren.

Nach der Berechnung weightedScore ist das Ergebnis 0.1234, aber sobald ich die Entität mit der Oracle-Datenbank festlege, wird der Wert als 0.12 angezeigt.

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

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

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

Update:

bei der Beschreibung Tabelle der Suche, die Definition der weightedScore Spalte ist NUMBER(19, 2). Ich habe jetzt auch versucht, die Anmerkung zu @Column(columnDefinition="Number(12, 9)") zu ändern, aber das hat keine Wirkung gehabt. Weiß jemand, warum Oracle auf diese Anmerkungen nicht reagiert?

Antwort

5

ich die Antwort gefunden. Hurra!

habe ich versucht, die folgende Abfrage durch die Oracle Apex-Schnittstelle auszuführen:

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

ich einen Fehler empfangen die besagt, dass eine Spalte Daten enthalten, können nicht weniger Genauigkeit oder weniger Umfang haben modifiziert werden. Das war mein Problem!

Da ich versuchte, 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 haben.

ich versuchte, die folgende Abfrage mit Erfolg:

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

Die Argumentation ist, dass ich 7 Plätze Präzision rechts von der Dezimalzahl hinzugefügt werden soll, so dass ich Zugabe von 7 auf die Gesamtgenauigkeit zu Ausgleich für den Anstieg der Skala. 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.