2012-03-25 13 views
18

Używam Scala Play! z Anorm do utrzymywania modelu danych w bazie danych. I po przykładowy kod here:Jak odzyskać klucz podstawowy podczas zapisywania nowego obiektu w Anorm

case class Bar(id: Pk[Long], name: String) 

object Bar { 

    val simple = { 
    get[Pk[Long]]("id") ~ 
    get[String]("name") map { 
     case id~name => Bar(id, name) 
    } 
    } 

    def findAll(): Seq[Bar] = { 
    DB.withConnection { implicit connection => 
     SQL("select * from bar").as(Bar.simple *) 
    } 
    } 

    def create(bar: Bar): Unit = { 
    DB.withConnection { implicit connection => 
     SQL("insert into bar(name) values ({name})").on(
     'name -> bar.name 
    ).executeUpdate() 
    } 
    } 

} 

Próbując rozwinąć na niej, chcę odzyskać klucz podstawowy właśnie utworzony i przechowywać go w klasie przypadku.

Jak mogę odzyskać klucz podstawowy?

Odpowiedz

35

Użyj metody executeInsert zamiast executeUpdate. Zauważony here, metoda foremer zwraca Option[T], gdzie T jest rodzajem klucza podstawowego.

Można wyodrębnić wartości z match stwierdzeniem:

DB.withConnection { implicit connection => 
     SQL(...).executeInsert() 
    } match { 
     case Some(long) => long // The Primary Key 
     case None  => ... 
    } 
+2

+1 próbowałem to dzisiaj – opyate

+3

Dotyczy to tylko wtedy, gdy klucz podstawowy jest klucz auto przyrostu. Jeśli tak nie jest, wynikiem będzie None Brak odpowiedzi. –

+0

To również nie działa dla 'INSERT IGNORE', jeśli nie ma włożonego identyfikatora. –

Powiązane problemy