2017-08-14 1 views
1

J'ai joué avec Play et j'ai rencontré un problème en essayant d'enregistrer des données d'exemple dans PostrgeSQL.Persist UUID dans PostgreSQL à l'aide de Play Slick - java.sql.BatchUpdateException

Je suis conscient que je peux convertir UUID en chaîne et l'enregistrer de cette façon, mais je ne peux pas le faire fonctionner avec UUID.

L'erreur que je reçois:

Error injecting constructor, java.sql.BatchUpdateException: Batch entry 0 insert into "COMPANIES" ("ID","NAME") values (?,'Amazon') was aborted: ERROR: column "ID" is of type uuid but expression is of type bytea

Mes dépendances:

libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4" 
libraryDependencies += "com.typesafe.play" %% "play-slick" % "3.0.1" 

classe affaire Société:

case class Company(id: UUID = UUID.randomUUID, name: String) 

définition de la table Slick:

val companies: TableQuery[Companies] = TableQuery[Companies] 

class Companies(tag: Tag) extends Table[Company](tag, "COMPANIES") { 
    override def * : ProvenShape[Company] = (id, name) <> (Company.tupled, Company.unapply) 

    def id: Rep[UUID] = column[UUID]("ID", O.PrimaryKey, O.SqlType("UUID")) 
    def name: Rep[String] = column[String]("NAME") 
} 

Dans les journaux, j'ai remarqué que UUID est converti en effet en octets:

[debug] s.j.J.statement - Preparing statement: insert into "COMPANIES" ("ID","NAME") values (?,?) 
[debug] s.j.J.parameter - /-------------+-----------\ 
[debug] s.j.J.parameter - | 1   | 2   | 
[debug] s.j.J.parameter - | Bytes  | String | 
[debug] s.j.J.parameter - |-------------+-----------| 
[debug] s.j.J.parameter - | [[email protected] | Amazon | 
[debug] s.j.J.parameter - | [[email protected] | Google | 
[debug] s.j.J.parameter - | [[email protected] | Microsoft | 
[debug] s.j.J.parameter - \-------------+-----------/ 

J'apprécierais vraiment de l'aide ou des conseils.

+0

Avez-vous importé le pilote pour Postgres? 'import dbConfig.profile.api._' – Dexmo

+0

Quel oubli de ma part! Auparavant, je bidouillais avec H2 donc j'ai importé 'import slick.jdbc.H2Profile.api._' au lieu de PostgresProfile, le compilateur ne s'est pas plaint et je l'ai oublié. Merci! –

Répondre

1

Vous devez importer le profil spécifique de votre système de base de données. Dans votre cas:

import slick.jdbc.PostgresProfile.api._ 

Bien que je recommande d'injecter le fournisseur de configuration, puis d'importer cette API. Ainsi, votre code fonctionnera si vous configurez un autre système de gestion de base de données.

class DAO @Inject()(@NamedDatabase("DB_NAME_FROM_CONFIG") protected val dbConfigProvider: DatabaseConfigProvider) 
         (implicit ec: ExecutionContext) { 
    import profile.api._ 

    ... 
}