使用 Play Slick 在 PostgreSQL 中持久化 UUID - java.sql.BatchUpdateException
Posted
技术标签:
【中文标题】使用 Play Slick 在 PostgreSQL 中持久化 UUID - java.sql.BatchUpdateException【英文标题】:Persist UUID in PostgreSQL using Play Slick - java.sql.BatchUpdateException 【发布时间】:2017-08-14 22:09:58 【问题描述】:我一直在玩 Play,但在尝试将一些示例数据保存到 PostrgeSQL 时遇到了问题。
我知道我可以将 UUID 转换为 String 并以这种方式保存,但我无法让它与 UUID 一起使用。
我得到的错误:
注入构造函数时出错,java.sql.BatchUpdateException:批处理条目 0 插入“COMPANIES”(“ID”,“NAME”)值(?,“Amazon”)被中止:错误:“ID”列属于类型uuid 但表达式是 bytea 类型的
我的依赖:
libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "3.0.1"
公司案例类:
case class Company(id: UUID = UUID.randomUUID, name: String)
光滑表定义:
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")
在日志中我注意到 UUID 确实被转换为字节:
[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 - | [B@17c2de51 | Amazon |
[debug] s.j.J.parameter - | [B@6a4e93d5 | Google |
[debug] s.j.J.parameter - | [B@69f81ed7 | Microsoft |
[debug] s.j.J.parameter - \-------------+-----------/
非常感谢一些帮助或提示。
【问题讨论】:
你是否为 Postgres 导入了 slick 驱动程序?import dbConfig.profile.api._
这是我的疏忽!以前我在摆弄 H2,所以我导入了 import slick.jdbc.H2Profile.api._
而不是 PostgresProfile,编译器没有抱怨,我忘记了。谢谢!
【参考方案1】:
您必须为您的数据库系统导入特定的配置文件。在你的情况下:
import slick.jdbc.PostgresProfile.api._
虽然我建议注入配置提供程序,然后导入该 api。这样,如果您配置另一个数据库管理系统,您的代码就可以工作。
class DAO @Inject()(@NamedDatabase("DB_NAME_FROM_CONFIG") protected val dbConfigProvider: DatabaseConfigProvider)
(implicit ec: ExecutionContext)
import profile.api._
...
【讨论】:
以上是关于使用 Play Slick 在 PostgreSQL 中持久化 UUID - java.sql.BatchUpdateException的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 play-slick 1.0.1/slick 3.0 连接到 mysql 数据库:配置错误
Play!:Slick 的 DDL 会取代 Evolutions 吗?
Play-Slick 插件是不是完全支持 Slick 2.0?
升级 Play 到 2.4,Slick 到 3.1.1,值 withTransaction 不是 play.api.db.slick.Database 的成员