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.