scala - Slick - 一对多表模式

标签 scala slick

假设我有如下案例类:

case class Warehouse(name:String, products:Seq[Product])
case class Product(name:String)

我想定义一个绑定(bind)到 Warehouse 的表类型
class Warehouses(tag: Tag) extends Table[Warehouse](tag, "warehouses") {
      def id = column[UUID]("id", O.PrimaryKey)
      def name = column[String]("name")
      def products = ???
}

我可以用元组定义我的表并引用 Warehouses来自 Products - 那将是我需要的一对多关系。但是我需要我的表来反射(reflect)我的域类,以便我可以执行 DBIO 操作并获取 Warehouse不是元组:
val warehouses = TableQuery[Warehouses]
db.run(warehouses.filter(_.id === 2).result.head) //this is of type Warehouse

如何从包含集合的案例类中定义模式?

最佳答案

Slick 不是 ORM

所以,Slick 不支持像 hibernate 这样的嵌套对象。如果您强烈希望拥有嵌套对象模型,则 Slick 不适合您的用例。这一点在 slick 文档中也明确提到。

您在 Slick 中的用例是这样建模的

case class WarehouseModel(name:String, id: Long)
case class ProductModel(name:String, productId: Long)
case class WarehouseProductsModel(warehouseId: Long, productId: Long) 
WarehouseProductsModel捕获 one-many产品与仓库的关系

请注意,上述设计看起来像是在一对多关系的情况下会选择执行的典型数据库设计。在 Slick 中,这些模型代表关系表。因此,对于每个表,我们需要有一个模型在代码中表示该表。 Slick 有助于编写 sql 不可知的、可组合的、可重用的、类型安全的和 scala 集合之类的查询。所以一天结束时,Slick 代码看起来像 Scala 集合操作代码。

关于scala - Slick - 一对多表模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390439/

相关文章:

Scala:具有相同声明的两个隐式参数

mysql - 在 Scala Slick 中实现复杂的左连接

scala - 在 scala slick 中动态创建表和更改表

Scala 继承问题 : val vs. def

scala - Haskell 如何区分不同的可能类型类实例

scala - sbt-assembly 的自定义输出路径

postgresql - Macaddr/Inet 类型的 postgres in slick

scala - 为什么在 Scala 中定义类型时会得到 "expected class or object definition"?

slick - slick 中的空值比较

scala - 如何防止 Future 永不完成