Play for Scala 책을 읽으면서 책에서 설명 된 이상한 점을 발견했습니다. 관련 스 니펫 :Squeryl을 사용한 영구 저장소에서 스칼라 부동성
이상한 일이 있습니다. 바닐라 사례 클래스가 변경되지 않는 클래스를 사용하는 경우 개체를 삽입 할 때 Squeryl이 개체의 불변 ID 인 필드를 업데이트 할 때 걱정할 수 있습니다.
Product(13, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic")
: 그것은 당신이 다음 코드를 실행하면val myImmutableObject = Product(0, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic") Database.productsTable.insert(myImmutableObject) println(myImmutableObject)
출력이 예기치 않게 같은 것을된다는 것을 의미합니다. 나머지 코드에서 모델 클래스 중 하나의 인스턴스가 절대로 변경되지 않을 것으로 예상되면 상황이 좋지 않을 수 있습니다. 물건의 종류에서 자신을 보호하기 위해 , 우리는 당신이 우리가 이전에이에 당신을 보였다 삽입 방법을 변경 추천 :
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을 사용하는 사람이 답을 줄 수 있습니까?
클래스 자체는 아니며'val'로 선언 된'table' 제네릭입니다. 이 테이블에 저장된 객체에 액세스하는 규칙을 지정합니다 (실제로는 사례 클래스로 표시됨). – Ashalynd
@ piet.t Lol 네 말이 맞아요. 나는 그런 식으로 생각하지 않았다. – smac89