在许多情况下,需要在数据库操作之前和之后应用函数。一个例子是加密。在INSERT和UPDATE之前需要对数据进行加密。它需要在SELECT之后解密。是否可以使用SORM添加此类挂钩?
答案 0 :(得分:1)
好吧,理论上你可以通过简单地覆盖它的方法来挂钩SORM,如下所示:
case class Thing( normalField : String, encryptedField : String )
object Db extends Instance (...) {
override def save
[ T <: AnyRef : TypeTag ]
( value : T )
: T with Persisted
= value match {
case value : Thing =>
super.save(value.copy(encryptedField = encrypt(value.encryptedField)))
case _ => super.save(value)
}
}
但是SORM 0.3。*不是为这样的自定义而设计的,并且挂钩查询功能将需要更多的努力和样板。我不太确定这样的问题是否与SORM有关,因为你有一个相当混乱的案例。
无论如何,您还有其他方法可以在应用程序方面解决您的问题。这是一对直接的头脑:
object Dao {
def saveA( a : Thing ) =
Db.save(a.copy(encryptedField = encrypt(a.encryptedField)))
def fetchAByNormalField( a : String ) =
Db.query[Thing].whereEqual("normalField", a).fetch()
.map(a => a.copy(encryptedField = decrypt(a.encryptedField)))
}
这里的结论是SORM的API非常简单,在它上面创建DAO主要只引入冗余抽象和样板。
case class Thing( normalField : String, decryptedField : String ){
def encrypted = EncryptedThing( normalField, encrypt(decryptedField) )
}
case class EncryptedThing( normalField : String, encryptedField : String ){
def decrypted = Thing( normalField, decrypt(encryptedField) )
}
请注意,您应该使用SORM注册EncyptedThing,而不是Thing:
object Db extends Instance( entities = Set(Entity[EncyptedThing]() ) )
您可以像这样使用它:
val thing = Thing(...)
Db.save(thing.encrypted)
val thing = Db.query[EncryptedThing].fetch().map(_.decrypted)
如果你不小心忘记触发转换,SORM会咆哮你,试图保存未注册的类型的值。应该注意的是,吠叫将在运行时。