这可能是由于我对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”这个事实有关?
答案 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
设置别名以保持一致性。