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

Как определить схему из класса case, который содержит коллекцию?

1 ответ

Решение

Слик это не ORM

Таким образом, 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.

Другие вопросы по тегам