2014-05-16 79 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项目中添加一个问题。

最好