Was sind die besten workarounds für bekannte Probleme mit Hibernate schema-Validierung von Gleitkomma-Spalten bei Verwendung von Oracle 10g?
Ich habe mehrere Java-Klassen mit Doppel-Felder, die ich bin persistierenden über Hibernate. Ich habe zum Beispiel
@Entity
public class Node ...
private double value;
Wenn Hibernate die org.hibernate.dialect.Oracle10gDialect
schafft den DDL-Code für die Knoten-Tabelle, Sie zeigt die Wert-Feld zu einem "double precision" - Typ.
create table MDB.Node (... value double precision not null, ...
Scheint es, dass in Oracle, "double precision" ist ein alias für "float". Also, wenn ich versuche, so überprüfen Sie die Datenbank-schema mit Hilfe der org.hibernate.cfg.AnnotationConfiguration.validateSchema()
Methode, Oracle erscheint, zu beschreiben, der Wert-Spalte als "float". Dies bewirkt, dass Hibernate werfen die folgende Ausnahme
org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision
Ein sehr ähnliches problem aufgeführt ist, im Ruhezustand ist der JIRA-Datenbank als HHH-1961. Ich möchte vermeiden, etwas zu tun, brechen, MySql, Postgres und Sql-Server-Unterstützung, so dass die Verlängerung der Oracle10gDialect
scheint die vielversprechendste workarounds erwähnt in HHH-1961. Es kann aber auch ein Dialekt ist etwas, was ich noch nie getan habe, und ich fürchte, es kann einige böse Fallstricke. Was ist die beste Problemumgehung für dieses problem, die nicht brechen wird unsere die Kompatibilität mit MySql, Postgres und Sql Server?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein bekannte Einschränkung der schema-validator überprüfen HHH-2315. So haben Sie drei Optionen hier (eigentlich vier, aber ich denke, dass die Deaktivierung der überprüfung nicht wollte). Entweder:
Verwenden
float
statt einerdouble
auf der Java-Ebene - könnte dies nicht eine option, obwohl.Patch
org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo)
um eine spezielle Bedingung, die für diesen speziellen Fall - das ist nicht wirklich eine option Licht.Erweitert die
org.hibernate.dialect.Oracle10gDialect
zu machen, verwenden Siefloat
für den SQL-TypDOUBLE
Die option später scheint sicher, aber erfordert einige Tests, um zu sehen, wenn es nicht einführen regression. Ich schaue nicht auf die Oracle-JDBC-Treiber-code, so kann ich nicht sagen, wie
float
unddouble precision
unterscheiden sich die Treiber-Ebene.nur hinzufügen (columnDefinition = "NUMBER(9,2)") funktioniert!
Gab es ein ähnliches problem HHH-1598 mit HSQL Zuordnungen von booleschen Feldern, und eine Diskussion darüber hier.
Die Lösung, die ich wählte zu verwenden, wurde in der Diskussion auf den oben verwiesen wird, mit einer Ausdehnung von HSQLDialect.
Sah ich keine Probleme mit diesem, obwohl ich nur HSQL-in-tests.
Es sicherlich nicht stören, alle anderen DB.
Verwenden 'scale-Attribut in Ihrem Mitglied.