【问题标题】:ClassCastException when trying to insert with Squeryl尝试使用 Squeryl 插入时出现 ClassCastException
【发布时间】:2012-12-18 19:17:20
【问题描述】:

这可能是由于我对 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 无法转换为 org.squeryl.dsl.CompositeKey]

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

【问题讨论】:

    标签: scala squeryl


    【解决方案1】:

    当我尝试你正在做的事情时,我得到了同样的行为。似乎由于某种原因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 以保持一致性。

    【讨论】:

    • 找不到类型“列”。它在哪里定义?谢谢
    • 可以通过导入找到注解:org.squeryl.annotations.Column
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多