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)
  }

update を呼び出す行で、例外がスローされます: [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、代わりに になりvalます。useridその後、一貫性のためにエイリアスを作成できます。

于 2012-12-18T20:54:56.663 に答える