我有一个案例类,它的一些字段作为选项类型 . 考虑以下案例类:
case class TypeA(field1: Int, field2: Option[String], field3: Boolean)
此案例类将由持久层实例化,该层调用数据库表并返回此案例类的实例 . field2的值来自数据库中的另一个表,几乎在所有情况下,返回TypeA的方法都不需要设置field2 . 通过执行数据库查找返回TypeA后,将设置field2的值 . 我想在TypeA中使用field2但我不希望将其作为TypeA构造函数的一部分 . 部分功能,特征浮现在我的脑海中,但由于我是Scala的新手,我正在寻找一些好的做法 . 有什么建议?
3 回答
如果我很了解您的情况,您可以执行以下操作:
请注意,在此解决方案中,field2是延迟填充的, always 依赖于数据库查找 .
这会实现你想要的吗?
实际上,如果您阅读两个表,然后从中创建一些聚合实体,我建议您考虑两种方法:
1) 也许你可以进行外连接查询,它将返回带有Option [T]参数的实体 . 在我们的项目中,我们使用Squeryl ORM . 你可以检查一下:http://squeryl.org/joins.html
这样的查询将返回List [(TypeA,Option [TypeB])]
然后,您可以将其映射到您想要的某个TypeC
2) 另一种解决方案:创建两个DAO服务,它们将从数据库中读取 . 然后制作聚合器服务,它将结合以下结果:
TypeA
- 基本特征,将有不同的implsSimpleTypeA
- 您从DB读取的实体 . 它有field2 as None你想要的^TypeB
- 您从DB收到的其他类型:然后,
AggregatedTypeA
- 实体,将从两个数据库中汇总信息:然后实施服务:
从DB中选择SimpleTypeA
在DB中查找TypeB
聚合SimpleTypeA和TypeB
示例impl(使用Google Guice)