Slick - 一对多表模式

时间:2016-11-02 21:52:57

标签: scala slick

假设我有以下案例类:

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

我想定义一个绑定到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 - 这将是我需要的一对多关系。但是我需要我的表来反映我的域类,所以我可以执行DBIO操作并获得Warehouse而不是元组:

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

如何从包含集合的案例类定义架构?

1 个答案:

答案 0 :(得分:6)

光滑不是ORM

因此,Slick不支持像hibernate这样的嵌套对象。如果您非常希望拥有嵌套对象模型,则Slick不适合您的用例。这一点也在光滑的文档中明确提到。

您在Slick中的用例建模如下

getopt

glibc捕获产品和仓库之间的case class WarehouseModel(name:String, id: Long) case class ProductModel(name:String, productId: Long) case class WarehouseProductsModel(warehouseId: Long, productId: Long) 关系

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