2014-02-01 2 views
0

Я купил эту проблему, когда использовал другие ОРМ. Я не мог найти лучшего решения. Теперь я использую Slick и PlayFramework, поэтому я думаю, может быть, есть один.Идентификатор продукта Поиск с базой данных

Предположим, у меня есть две таблицы в моей базе: Tags и Product.

Я получаю информацию из одной HTML-формы, содержащей как данные продукта, так и данные тегов. Теги связаны с продуктом, поэтому, естественно, у меня есть другая таблица под названием Product_Tag для этого двунаправленного отношения.

Затем я хранил информацию о продукте. Мой полезный код выглядит так:

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") 

Теперь проблема становится, как я могу сохранить связь между меткой и продуктом, когда я даже не знаю их идентификаторы? Да, я мог сначала сохранить tag и product, а затем получить их, чтобы иметь ID, но я ненавижу делать это, потому что я чувствую себя неэффективным.

Есть ли способ обойти это? Java UUID ??

ответ

1

Вы можете создать проекцию AutoInc, чтобы заставить его вернуть идентификатор со вставкой, например:

// 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, и вы находитесь на Slick 1.0. Некоторые базы данных (например, postgres) перевернут таблицу, когда вы попытаетесь вставить нуль в столбец первичного ключа для autoInc, как вы делаете выше. В этом случае вам придется либо удалить идентификатор из проекции вставки, либо просто перейти на слайк 2.0, который будет обрабатывать это более изящно.

Если вы только начинаете новый проект, я настоятельно рекомендую просто перейти на 2.0 сейчас.

+0

Привет, я обновил до Slick 2.0 и претерпел много изменений. Я применил «возвращаемый идентификатор», но моя IDE говорит «несоответствие типов: запрос [NotInferedRT, NotInferedRU], фактический: Column [Int]». –

+0

Да, есть куча изменений в том, как работает гладкий 2.0 и slick 1.0, но они также обновили документацию на сайте. Для конкретных изменений между версиями это должно быть полезно: http://slick.typesafe.com/doc/2.0.0/migration.html Для конкретного примера того, что вы хотите сделать, https://github.com/ slick/slick-examples/blob/master/src/main/scala/com/typesafe/slick/examples/lifted/MultiDBCakeExample.scala (вокруг строки 26-27) –

Смежные вопросы