2017-07-19 2 views
0

Während zu postgresql Migration, ich bin unten Frage, die unsInkompatible Typen: numerisch und bigint. In PostgeSQL

Schlüsselspalten veh_reg_authority und id inkompatibler Typen sind: numeric und bigint. Im Folgenden sind Zuordnungen:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "VEH_REG_AUTHORITY", columnDefinition ="Numeric(12,0)") 
private VehicleRegistrationAuthority vehicleRegistrationAuthority; 

VehicleRegistrationAuthority hat id vom Typ Long so die zu BIGINT nach PostgreSQL in konvertiert.

So eine einfache Lösung ist, columnDefinition = "Numeric (12,0)" entsprechend zu ändern, aber wir können das nicht tun, da es gut mit Oracle und MySQL funktioniert, und es wurde stark in Out-Code so nicht möglich wechseln.

Im Folgenden sind Arten in Oracle, MySQL und PostgreSQL:

column       java type    Oracle  Mysql PostGreSQL 
id        Long     NUMBER  BIGINT BIGINT 
veh_reg_authority VehicleRegistrationAuthority  NUMBER decimal(12,0) NUMERIC 

Während unten Ausgabe gibt Fremdschlüssel überwintern zu schaffen.

Caused by: org.postgresql.util.PSQLException: ERROR: foreign key constraint "fk7gyqskn6x2l2910xhhtjgvh0j" cannot be implemented 
Detail: Key columns "veh_reg_authority" and "id" are of incompatible types: numeric and bigint. 

Antwort

0

Sie sollten den gleichen Datentyp für beide Spalten verwenden, wenn Sie eine Fremdschlüsseleinschränkung definieren möchten.

Wenn Ihre Anwendung in Oracle mit dem Datentyp NUMBER für beide Spalten funktioniert, warum sollte es in PostgreSQL nicht funktionieren, wenn Sie numeric für beide verwenden? Diese Datentypen sind vergleichbar.

+0

Eigentlich, wenn Sie Long (Java-Typ) verwenden, bildet Hibernate es zu java.sql.Types.BIGINT (JDBC-Typ), die wenn in BIGINT in Postgresql zugeordnet werden. Und für einige spezifische präzisionsbasierte Zahlen müssen wir Numerisch verwenden. Numeric und BIGINT sind in MYSQL kompatibel und Oracle verwendet NUMBER sowohl für BIGINT als auch für NUMERIC, so dass keine Probleme bei mysql und Oracle auftreten. –

+0

Sie sollten den gleichen Java-Typ für beide Spalten verwenden, alles andere ist falsch. Dann geht das Problem weg. –