Slick - 一对多 table 架构

Slick - one to many table schema

假设我有如下情况class:

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

我想定义一个绑定到 Warehouse 类型的 table

class Warehouses(tag: Tag) extends Table[Warehouse](tag, "warehouses") {
      def id = column[UUID]("id", O.PrimaryKey)
      def name = column[String]("name")
      def products = ???
}

我可以用元组定义我的 table 并从 Products 引用 Warehouses - 这将是我需要的一对多关系。但是我需要我的表来反映我的域 classes 以便我可以执行 DBIO 操作并得到 Warehouse 而不是元组:

val warehouses = TableQuery[Warehouses]
db.run(warehouses.filter(_.id === 2).result.head) //this is of type Warehouse

如何根据包含集合的案例 class 定义模式?

Slick 不是 ORM

因此,Slick 不支持像 hibernate 这样的嵌套对象。如果您强烈希望嵌套对象模型 Slick 不是适合您用例的 suitable 解决方案。这一点在华而不实的文档中也有明确提及。

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

case class WarehouseModel(name:String, id: Long)
case class ProductModel(name:String, productId: Long)
case class WarehouseProductsModel(warehouseId: Long, productId: Long) 

WarehouseProductsModel 捕获 Product 和 Warehouse

之间的 one-many 关系

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