尝试使用Squeryl插入时出现ClassCastException

时间:2012-12-18 19:17:21

标签: scala squeryl

这可能是由于我对Squeryl如何运作的误解。我的实体定义为:

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

我的表变量定义为:

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

然后我只是打电话给钱包试图加钱:

val requestedWallet = wallet.copy(amount = wallet.amount + amount)
try {
  inTransaction {
    walletTable.update(requestedWallet)
  }

在我调用update的行上,会抛出异常: [ClassCastException:java.lang.Integer无法强制转换为org.squeryl.dsl.CompositeKey]

我根本不使用复合键,所以这非常令人困惑。是否与我的id字段不是“id”,而是“userid”这个事实有关?

1 个答案:

答案 0 :(得分:4)

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

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

  def userid = id

}  

列注释将在数据库中查找userid字段,而id将是val。然后,您可以为userid设置别名以保持一致性。