squeryl - 将 bigDecimal 保存到数据库

Posted

技术标签:

【中文标题】squeryl - 将 bigDecimal 保存到数据库【英文标题】:squeryl - saving bigDecimal to database 【发布时间】:2013-06-30 21:48:10 【问题描述】:

我正在使用 Scala 的 squeryl(版本 0.9.6-RC1 和 scala 2.10)并尝试将我的模型序列化到 H2 数据库。

我的模型类有一些字符串字段和一些 BigDecimal 类型 (scala.BigDecimal)。

我使用模型类中的 Schema.create 创建数据库模式,不幸的是 squeryl 总是为 BigDecimal 创建太小的字段,这使我的列值太长 "MULTPZ DECIMAL(20, 16) NOT NULL": "1000000.0000000000000000 (23)";

这是 squeryl 中的某种错误吗?原始值为"1000000.0000",并正确解析为BigDecimal。

我已经测试了上述情况,我创建了一个单独的表,其字段定义为"DECIMAL(20, 20)",在这种情况下,squeryl 会尝试插入"1000000.00000000000000000000 (27)"

【问题讨论】:

【参考方案1】:

最简单的解决方法是覆盖架构中的defaultSizeOfBigDecimal 方法。它返回一个元组,其中包含包含 BigDecimal 的数字列的长度和比例。您还可以使用 @Column 注释在每个字段的基础上设置这些值。

【讨论】:

很好,这很有效。我尝试的第一件事是设置它并将代码与现有数据库一起使用,但这不起作用。然后我删除了模式并使用 defaultSizeOfBigDecimal 集重新创建了它。为什么会有这样的行为?? Squeryl 不处理模式演变。没有一种万能的方法来实现这一点。搜索 Squeryl 列表,您可以找到更多相关信息以及对外部库的建议。 但这是一个初始模式创建。我一直在创建一个新的数据库架构,但新的插入操作立即失败了。

以上是关于squeryl - 将 bigDecimal 保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Scala 反射和 Squeryl

在 Squeryl 中使用聚合连接多个表

如何让 Squeryl 与 Play 一起工作!框架?

尝试使用 Squeryl 插入时出现 ClassCastException

使用“使用”的 Squeryl 会话管理

使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?