我可以在SORM中为数据库操作添加挂钩吗?

时间:2013-03-12 11:32:59

标签: sorm

在许多情况下,需要在数据库操作之前和之后应用函数。一个例子是加密。在INSERT和UPDATE之前需要对数据进行加密。它需要在SELECT之后解密。是否可以使用SORM添加此类挂钩?

1 个答案:

答案 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有关,因为你有一个相当混乱的案例。

无论如何,您还有其他方法可以在应用程序方面解决您的问题。这是一对直接的头脑:

1。经典的DAO方法:

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主要只引入冗余抽象和样板。

2。转换器方法:

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会咆哮你,试图保存未注册的类型的值。应该注意的是,吠叫将在运行时。