簡體   English   中英

來自Postgresql的類型和來自Play(異常)的類型

[英]Types from Postgresql and types from Play (anorm)

我有一個代表模型的班級:

class Payment(
  val id: Pk[Int] = NotAssigned,
  //.....
)

這是在db中的定義方式:

CREATE TABLE payment
(
  id serial NOT NULL,
  //.........
)

它引發異常java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer我在整個項目中經常遇到這樣的異常。 我認為這是因為我在Play(anorm)和Postgresql中使用了錯誤的數據類型,這意味着它們之間沒有正確對應。

那么,在哪里可以找到與主動脈類型相對應的Postresql類型呢? 我發現這些信息很少,也沒有出現在官方網站上。 這樣的對應表似乎根本不存在,對嗎?

這些是對應的類型:

1)scala中的int和postgresql中的inte / serial是32位,並且都達到2,147,483,647。 Postgresql序列號只是一個自動遞增的整數。

2)scala中的long和postgresql中的bigint / bigserial是64位,並且都達到9,223,372,036,854,775,807。 PostgreSQL bigserial只是一個自動遞增的bigint。

如果要使用相同的類型,則可以使用bigserial / Long或serial / Int。

但是,對於我們的項目,我們最終在Scala中使用Long並在postgresql中使用了serial,這很好用。 如果將來需要的話,這使我們可以自由地將postgresql中的數據類型從串行更改為bigserial。

附帶說明一下,我們看不到Pk [..]有任何真正的優勢,因此決定使用Option [Long]代替Pk [Long],並選擇None代替NotAssigned。 然后,您將使用通用的Option類型,並且永遠不需要將定理導入到控制器中。

Anorm與數據庫無關,它不在乎數據庫供應商特定的類型,而在乎JDBC類型。 您可以在Oracle文檔中找到JDBC類型映射: http : //docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html#table1

Play 2.3(最新版本)中包含的Anorm需要更多的數字轉換。 您可以在http://applicius-en.tumblr.com/post/87829484643/anorm-whats-new-play-2-3中找到詳細信息。

如果您對最新的Anorm仍然存在轉換問題,則可以在Play github項目上添加一個問題。

最好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM