我在使用其他ORM时遇到了这个问题。我找不到更好的解决方案。现在我使用Slick和PlayFramework,所以我想也许有一个。
假设我的数据库中有两个表:Tags
和Product
。
我从包含产品数据和标签数据的单个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时,如何存储标签和产品之间的关联?是的,我可以先保存tag
和product
,然后检索它们以获取ID,但我讨厌这样做,因为我感觉效率低下。
有没有解决这个问题? Java的UUID ??
答案 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。