Postgresql中的类型和Play中的类型(anorm)

时间:2014-05-16 14:26:59

标签: java postgresql scala playframework 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对应于anorm的类型?我发现信息只有很小的和平,而且他们不在官方网站上。似乎这种对应的表格甚至不存在,是吗?

2 个答案:

答案 0 :(得分:1)

这些是相应的类型:

1)在scala中的Int和postgresql中的整数/串行是32位,都高达2,147,483,647。 Postgresql serial只是一个自动递增的整数。

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。然后使用通用选项类型,永远不需要将anorm导入控制器。

答案 1 :(得分:0)

Anorm与数据库无关,它不关心数据库供应商特定类型,而是关于JDBC类型。您可以在Oracle doc:http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html#table1中找到JDBC类型映射。

Play 2.3(最新版本)中包含的Anorm可以处理更多的数字转换。您可以在http://applicius-en.tumblr.com/post/87829484643/anorm-whats-new-play-2-3找到详细信息。

如果您仍然遇到最新Anorm的转换问题,您可以在Play github项目中添加一个问题。

最佳