2012-03-25 13 views
18

¡Estoy usando Scala Play! marco con Anorm para persistir en el modelo de datos a la base de datos. Seguí el ejemplo de código here:Cómo recuperar la clave principal al guardar un nuevo objeto en 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() 
    } 
    } 

} 

Tratando de ampliar en él, quiero recuperar la clave primaria que acaba de crear y almacenarlo en la clase de caso.

¿Cómo puedo recuperar la clave principal?

Respuesta

35

Utilice el método executeInsert en lugar de executeUpdate. Conocido como here, el método de foremer devuelve Option[T] donde T es el tipo de clave principal.

puede extraer el valor con una declaración match:

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

+1 Probé esto hoy – opyate

+3

Esto sólo se aplica si la clave primaria es una clave de incremento automático. Si no, el resultado será None –

+0

Además, esto no funciona para "INSERT IGNORE" si no hay una identificación insertada. –

Cuestiones relacionadas