2017-05-04 100 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

回答