我有一个代表模型的类:
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的类型?我发现信息只有很小的和平,而且他们不在官方网站上。似乎这种对应的表格甚至不存在,是吗?
答案 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项目中添加一个问题。
最佳