【发布时间】:2014-10-20 21:08:43
【问题描述】:
假设我的数据库中有以下表格:
CREATE TABLE dealers(
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE makers(
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE cars(
id INT PRIMARY KEY,
make INT FOREIGN KEY makers(id),
model VARCHAR(255),
year INT
);
CREATE TABLE cars_in_dealers(
car_id INT FOREIGN KEY cars(id),
dealer_id INT FOREIGN KEY dealers(id),
UNIQUE KEY (car_id, dealer_id)
);
鉴于这样的架构,我想使用 Slick 在 Scala 中加载经销商:
case class Dealer(id: Int, name: String, models: Set[Car])
case class Car(id: Int, make: Maker, model: String, year: Int)
case class Maker(id: Int, name: String)
来点复杂一点的怎么样:
如果我想跟踪每个经销商的型号数量,该怎么办:
case class Dealer(id: Int, name: String, models: Map[Car, Int])
这是我的映射表:
CREATE TABLE cars_in_dealers(
car_id INT FOREIGN KEY cars(id),
dealer_id INT FOREIGN KEY dealers(id),
count INT,
UNIQUE KEY (car_id, dealer_id)
);
我熟悉 Ruby 的 ActiveRecord 和 Java 的 Hibernate 框架,这些东西很容易做到,但我在 Slick 中很难做到,因为 Slick 不会将嵌套模型映射到外键表中。我正在使用 Slick 的代码生成器,它只生成以下类:
case class DealersRow(id: Int, name: String)
case class MakersRow(id: Int, name: String
case class CarsRow(id: Int, make: Int, model: String, year: Int)
case class CarsInDealersRow(carId: Int, dealerId: Int)
【问题讨论】:
-
Slick 不是也不应该用作 ORM。不要尝试将外键映射到除了聚合根之外的序列(在这种情况下,不要尝试懒惰地加载它们)。它只是行不通。太复杂了。
-
你在 Scala 中推荐什么是 ORM 的好库?我在 Slick 中大约 50% 的代码将所有这些连接和元组转换写入嵌套模型。我想要一些开箱即用的东西,我的面向对象模型巧妙地映射到开箱即用的关系数据库..
标签: hibernate scala orm slick slick-2.0