2017-07-19 19 views
0

在遷移到PostgreSQL,我面臨跌破發行不兼容的類型:numeric和bigint。在PostgeSQL

鍵列veh_reg_authorityid是不相容的類型:numericbigint。 下面是映射:

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

VehicleRegistrationAuthority具有Long類型的id所以其在轉換到BIGINT按的PostgreSQL。

因此,一個簡單的解決方案是相應地更改columnDefinition =「Numeric(12,0)」,但我們不能這樣做,因爲它可以很好地與oracle和mysql一起使用,並且它已經在代碼中大量使用,所以不可能改變。

以下是在Oracle,MySQL等,和PostgreSQL類型:

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

在創建外鍵休眠,給出以下的問題。

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. 

回答

0

如果您要定義外鍵約束,則應該爲兩列使用相同的數據類型。

如果您的應用程序在兩個列中使用數據類型NUMBER在Oracle中正常工作,那麼爲什麼在PostgreSQL中無法使用numeric?這些數據類型是可比的。

+0

實際上,當你使用Long(java類型)時,Hibernate將它映射到java.sql.Types.BIGINT(JDBC類型),如果它映射到postgresql中的BIGINT。對於一些特定的基於精度的數字,我們必須使用Numeric。數字和BIGINT在MYSQL中是兼容的,Oracle對BIGINT和NUMERIC都使用NUMBER,因此在mysql和oracle上沒有問題。 –

+0

您應該對兩列使用相同的Java類型,其他所有內容都是錯誤的。然後問題消失。 –