1

这可能是由于我对 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)
  }

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

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

4

1 回答 1

5

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

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

  def userid = id

}  

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

于 2012-12-18T20:54:56.663 回答