2017-05-04 39 views
3

所以當我讀Play for Scala書時,我遇到了一些奇怪的東西,這在書中解釋。這是相關的片段:Scala永久存儲與Squeryl不變性

雖然有一些奇怪的事情發生。如果您使用不可變的 類 - 哪些是香草案例類 - 您可能會擔心當您 發現Squeryl在您插入對象時更新對象的所謂不可變ID 字段。這意味着,如果你執行 下面的代碼,

val myImmutableObject = Product(0, 5010255079763, 
    "plastic coated blue", "standard paperclip, coated with blue plastic") 
Database.productsTable.insert(myImmutableObject) 
println(myImmutableObject) 

輸出將意外地是這樣的:Product(13, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic")。如果代碼的其餘部分預計您的模型類之一的實例永不改變,這可能會導致不好的情況。 爲了保護自己免受這類的東西,我們建議您 改變插入的方法,我們向您展示了更早的進入這樣的:

def insert(product: Product): Product = inTransaction { 
    val defensiveCopy = product.copy 
    productsTable.insert(defensiveCopy) 
} 

我的問題是,考慮到產品類被這樣定義:

import org.squeryl.KeyedEntity 

case class Product(
    id: Long, 
    ean: Long, 
    name: String, 
    description: String) extends KeyedEntity[Long] 

Database對象的定義如下:

import org.squeryl.Schema 
import org.squeryl.PrimitiveTypeMode._ 
object Database extends Schema { 
    val productsTable = table[Product]("products") 
    ... 

    on(productsTable) { p => declare { 
     p.id is(autoIncremented) 
    }} 
} 

那麼如何聲明val的案例類別可以更改其中一個字段? Squeryl是使用某種反射來改變場地,還是以某種方式弄錯書本?

我無法運行示例來驗證可能的情況,但使用Squeryl的人可以給出答案?

+0

它不是案件類本身,它是聲明爲「val」的'table'泛型。它指定訪問存儲在該表中的對象的規則(它們確實被表示爲案例類)。 – Ashalynd

+0

@ piet.t大聲笑你是對的。我沒有這樣想過 – smac89

回答