尝试使用 Squeryl 插入时出现 ClassCastException

Mar*_*ark 1 scala squeryl

这可能是由于我对 Squeryl 的工作方式的误解。我的实体定义为:

case class Wallet(userid: Int, amount: Long) 
    extends KeyedEntity[Int] with Optimistic {  
  def id = userid
}  
Run Code Online (Sandbox Code Playgroud)

我的表变量定义为:

val walletTable = table[Wallet]("wallets")
on(walletTable) {
 w =>
   declare {
     w.userid is (primaryKey)
   }
}
Run Code Online (Sandbox Code Playgroud)

然后我只是调用一个方法来尝试向钱包中添加钱:

val requestedWallet = wallet.copy(amount = wallet.amount + amount)
try {
  inTransaction {
    walletTable.update(requestedWallet)
  }
Run Code Online (Sandbox Code Playgroud)

在我调用更新的那一行,抛出一个异常: [ClassCastException: java.lang.Integer cannot be cast to org.squeryl.dsl.CompositeKey]

我根本没有使用复合键,所以这很令人困惑。这是否与我的 id 字段不被称为“id”,而是“userid”这一事实有关?

jce*_*ern 5

当我尝试你正在做的事情时,我得到了同样的行为。似乎出于某种原因id不能是别名,除非它是复合键(至少在 0.9.5 中)。您可以解决这个问题,并通过以下方式获得相同的结果:

case class Wallet(@Column("userid") id: Int, amount: Long)
  extends KeyedEntity[Int] with Optimistic  {  

  def userid = id

}  
Run Code Online (Sandbox Code Playgroud)

列注释将在数据库中查找该userid字段,并将改为ida val。然后您可以userid为一致性使用别名。