Alors que je suis en train de lire le Jouer pour Scala livre, je suis tombé sur quelque chose de bizarre qui était expliqué dans le livre. Voici le passage en question :
Il y a quelque chose d'étrange qui se passe, cependant. Si vous utilisez des classes immuables immuables - ce qui est le cas des classes de vanille - vous pourriez être inquiet lorsque vous découvrez que Squeryl met à jour le champ id de votre objet, supposé immuable. de votre objet lorsque vous insérez l'objet. Cela signifie que si vous exécutez la commande code suivant,
val myImmutableObject = Product(0, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic") Database.productsTable.insert(myImmutableObject) println(myImmutableObject)
le résultat sera, contre toute attente, quelque chose comme :
Product(13, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic")
. Cela peut conduire à de mauvaises situations si le reste de votre code s'attend à ce qu'une instance de l'une de vos classes de modèle ne change jamais. Afin de vous protéger de ce genre de situation, nous vous recommandons de changer les méthodes d'insertion que nous vous avons montrées plus tôt en ceci :def insert(product: Product): Product = inTransaction { val defensiveCopy = product.copy productsTable.insert(defensiveCopy) }
Ma question est la suivante : étant donné que la classe de produit est définie comme suit :
import org.squeryl.KeyedEntity
case class Product(
id: Long,
ean: Long,
name: String,
description: String) extends KeyedEntity[Long]
Database
est défini comme suit :
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)
}}
}
Comment alors est-il possible qu'une classe de cas déclarée en tant que val
peut avoir un de ses champs modifiés ? Squeryl utilise-t-il une sorte de réflexion pour modifier le champ ou le livre fait-il une erreur ?
Je ne suis pas en mesure d'exécuter les exemples pour vérifier ce que le cas pourrait être, mais quelqu'un qui a utilisé Squeryl peut peut-être donner une réponse ?