2017-05-04 5 views
3

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을 사용하는 사람이 답을 줄 수 있습니까?

+0

클래스 자체는 아니며'val'로 선언 된'table' 제네릭입니다. 이 테이블에 저장된 객체에 액세스하는 규칙을 지정합니다 (실제로는 사례 클래스로 표시됨). – Ashalynd

+0

@ piet.t Lol 네 말이 맞아요. 나는 그런 식으로 생각하지 않았다. – smac89

답변

0

당신은 자신을 위해 table 방법의 정의를 확인할 수 있습니다

https://github.com/squeryl/squeryl/blob/master/src/main/scala/org/squeryl/Schema.scala#L345

그것은 주어진 경우에 클래스에 바인드 Table 개체의 인스턴스를 사용하여 반사를 수행하는 일반적인 기능입니다. 함수는 Scala의 일류 시민이므로 다른 것과 마찬가지로 val에 할당 할 수 있습니다.

또한 마지막 조각은 주어진 인수에 대해 정의 된 수정 사항을 매핑하는 비동기 함수이기도합니다.