2014-05-16 18 views
1

我有一個表示模型類:類型和播放(ANORM)類型

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

下面是如何在一個數據庫中定義:

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

它拋出一個異常java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer我經常在一個項目中遇到這樣的例外情況。我認爲這是因爲我在Play(anorm)和Postgresql中使用了錯誤的數據類型,這意味着它們不能正確對應。

那麼我該如何找出哪種類型的Postresql對應於anorm類型?我發現只有很少的信息,他們沒有在官方網站上。似乎這樣的通信表格甚至不存在,是嗎?

回答

1

這些是對應類型:

1)中等在階和整數/串行PostgreSQL中是32位並且兩個上去2147483647。 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中使用了串行,這很好。這使我們可以自由地將postgersql中的數據類型從串行更改爲bigserial,如果將來需要的話。

作爲一個方面說明,我們看不到Pk [..]的任何實際優勢,所以決定使用Option [Long]而不是Pk [Long]和None來代替NotAssigned。然後你使用通用的Option類型,並且永遠不需要將anorm導入你的控制器。

+0

但我在問所有類型。 –

0

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項目中添加一個問題。

最好