使用数据库检索产品ID

时间:2014-02-01 20:17:20

标签: scala slick

我在使用其他ORM时遇到了这个问题。我找不到更好的解决方案。现在我使用Slick和PlayFramework,所以我想也许有一个。

假设我的数据库中有两个表:TagsProduct

我从包含产品数据和标签数据的单个HTML表单中获取信息。标签与产品相关联,因此我自然会为此双向关系提供另一个名为Product_Tag的表。

然后我存储Product的信息。我的产品光滑代码如下所示:

Object Product extends Table[Product]("Products") {
    def id = column[Int]("PRD_ID", O.PrimaryKey, O.AutoInc)
    def name = column[String]("PRD_NAME")
    ...
}

标记代码看起来很相似。以下是Product_Tag的代码:

Object Product_Tag extends Table[Product_Tag]("Product_Tags") {
  def prd_id = column[Int]("PRD_ID")
  def tag_id = column[Int]("TAG_ID")
  def tag_name = column[String]("TAG_NAME")
  ....
}

我应该在保存产品时存储与该产品相关联的标签。我用这段代码来保存它:

Product.insert(None, "product A")

现在问题变成了,当我甚至不知道他们的ID时,如何存储标签和产品之间的关联?是的,我可以先保存tagproduct,然后检索它们以获取ID,但我讨厌这样做,因为我感觉效率低下。

有没有解决这个问题? Java的UUID ??

1 个答案:

答案 0 :(得分:1)

您可以设置autoInc投影,使其返回带插入的id,如:

// In the same place as your * projection
def autoInc = id.? ~ name <> (Product.apply _, Product.unapply _) returning id

// In your client code
val id = Product.autoInc.insert(Product(...))

有关此处的更多信息:https://github.com/slick/slick/issues/10

略有不相关:看起来您尝试插入带有None ID的产品,并且您使用的是Slick 1.0。当您尝试在autoInc的主键列中插入null时,某些数据库(如postgres)将翻转表,就像您在上面所做的那样。在这种情况下,你要么必须从插入投影中删除id,要么只升级到更优雅地处理它的slick 2.0。

如果你刚刚开始一个新项目,我强烈建议你现在就转移到2.0。