scala - 继承和多态关系是否可能/Slick 的一个好主意?

标签 scala playframework playframework-2.0 slick slick-2.0

考虑我目前正在研究的以下简化域模型:

case class Product(val id : Long, val name : String, product : Option[Product], category : Option[ProductCategory])

case class Price(val id : Long, val amount : Double, val conditions : Seq[Condition])

trait Condition {
  def isTrue(product: Product):Boolean
}
case class ManufacturerNameCondition(val id : Long, val name : String){...}
case class DateCondition(val id : Long, val validFrom : Date, val validTo : Date){...}

这个模型代表什么?

它代表一个简单的价格服务,它允许为一个产品或产品类别定义多个价格。产品的最终价格是通过检查其所有匹配价格及其相关条件来确定的。例如。产品可能有一个正常价格和一个额外价格,该价格仅在今天有效,因为它具有 DateCondition。

我的问题是什么?
一个价格可能与多个条件相关联。每个条件可能是另一种类型。所以我问自己应该如何用 Slick(=多态关系)解决这个问题。基本上我想要一个类似 DAO 的界面,它可以获取价格和相关条件。

我的问题:
  • 是否可以用 Slick 实现这个模型? (可能是)
  • 多态关系:在 Slick 中解决这个问题是个好主意吗? Slick 表示它想要克服对象关系不匹配,在这里我感觉好像我试图用这个模型来对抗框架。 Slick 不适合这种面向对象的方法吗?我应该选择另一种方法吗?

  • 请注意:
    是的,我没有代码可以显示我尝试过的内容,但现在我需要一些方向来寻找。目前我不知何故迷路了:-)

    最佳答案

    Slick 并没有克服对象关系阻抗失配,而是避免了它。如何在 Slick 中对其进行建模的答案基本上是如何在关系模型(而不是 ORM)中对其进行最佳建模。 Slick 在 SQL 之上添加的是类型安全性、scala 语义和可组合性,即编写可以正常重用的函数和代码片段的能力。如果你真的需要继承,你将不得不自己映射它,但是 Slick 的可组合性可以帮助你让它不会过于痛苦。例如。有一个 kindrole列,它告诉您它是什么。然后要么做 single-table inheritance并向 <> 提供功能Slick 中的映射运算符,它产生正确的子类。或者做class-table inheritance ,加入一切并做同样的事情。或者写一个函数,你可以给它一个 kind它只进行必要的连接。你甚至可以把它放在一个库中,然后放在 github 上供其他人重复使用:)。

    关于scala - 继承和多态关系是否可能/Slick 的一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22564650/

    相关文章:

    java - Ebean:奇怪的结果

    java - 在模板参数中 Play 2.0 括号

    ScalaTest AsyncFunSuiteLike 多个断言

    scala - 老式特征扩展下的蛋糕方法有什么好处?

    scala - 如何在 "IF"中打印 "THEN"条件的源代码

    scala - SBT:列出项目依赖库

    java - 如何运行 2 个不同的游戏!同一台本地机器上两个不同端口的框架实例?

    java - Play Framework 2.2.1 - 添加非 Play Java 项目作为子项目

    java - Play Framework 2 : Create images in public/images

    java - 系统时区 ID