Java 来自Postgresql的类型和来自Play的类型(anorm)

Java 来自Postgresql的类型和来自Play的类型(anorm),java,postgresql,scala,playframework,anorm,Java,Postgresql,Scala,Playframework,Anorm,我有一个表示模型的类: class Payment( val id: Pk[Int] = NotAssigned, //..... ) 以下是如何在数据库中定义它: CREATE TABLE payment ( id serial NOT NULL, //......... ) 它抛出一个异常java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer我在整个项目中经常遇到这样的异常。我想这是因为我在Pla

我有一个表示模型的类:

class Payment(
  val id: Pk[Int] = NotAssigned,
  //.....
)
以下是如何在数据库中定义它:

CREATE TABLE payment
(
  id serial NOT NULL,
  //.........
)
它抛出一个异常
java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer
我在整个项目中经常遇到这样的异常。我想这是因为我在Play(anorm)和Postgresql中使用了错误的数据类型,这意味着它们之间没有正确地对应


那么,我在哪里可以找到Postresql的类型对应于anorm的类型呢?我只发现了少量的信息,它们并没有出现在官方网站上。似乎这种对应关系的表格根本不存在,是吗?

这些是对应的类型:

1) scala中的Int和postgresql中的integer/serial是32位,它们的最大值都是2147483647。Postgresql序列只是一个自动递增的整数

2) scala中的Long和postgresql中的bigint/bigserial是64位的,它们的最大值都是9223372036854775807。Postgresql bigserial只是一个自动递增的bigint

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

然而,对于我们的项目,我们最终在Scala中使用了Long,在postgresql中使用了serial,这很好。这使我们可以自由地在将来需要时将postgresql中的数据类型从serial更改为bigserial


作为补充说明,我们看不到Pk[…]的任何真正优势,因此决定使用选项[Long]代替Pk[Long],使用None代替NotAssigned。然后使用泛型选项类型,将永远不需要将anorm导入控制器。

anorm与数据库无关,它不关心数据库供应商特定的类型,而是关心JDBC类型。您可以在Oracle文档中找到JDBC类型映射:

Play 2.3(最新版本)中包含的Anorm负责更多的数字转换。有关详细信息,请访问

如果您在使用最新的Anorm时仍然存在转换问题,您可以在PlayGithub项目中添加一个问题


最好的

但我问的是所有类型的。