如何按名称获取Lift MetaMapper对象的引用?

时间:2010-10-19 12:28:08

标签: scala scala-2.8 lift mapper

在建模审计表时,我已经包含了查找被审计的原始记录所必需的字段(oid:String,className:String)。我想以编程方式找到Mapper类名的MetaMapper。

例如,如果我有:

class Foo extends Mapper[Foo] {
  def getSingleton = Foo
}

object Foo extends Foo with MetaMapper[Foo] {
}

鉴于字符串“Foo”,我如何获得对象Foo的引用?最后我想要一个MetaMapper的引用,这样我就可以做一个findAll。在我的Hibernate时代,我可能已经找到了一个使用Class.byName(className)的类,然后在该类上调用了一个静态方法。

以下是我现在正在使用的内容,但它确实需要维护MetaMapper对象列表并使用MetaMapper实例化类#create:

case class Audited(name: String, url: Box[String])
def getAudited : Box[Audited] = {
  // OBJECT_OID and OBJECT_TYPE are for the audited record we are trying to find
  (OBJECT_OID.is, OBJECT_TYPE.is) match {
    case (ooid, otype) if List(ooid,otype).forall(s => StringUtils.isNotBlank(s)) => {
      // maintain a list of objects that are metamappers
      val metas = List(Client)
      (for {
        // create a new instance and check its class name
        meta <- metas.find(meta => meta.create.getClass.getName == otype)
        mapper <- meta.find(By(meta.primaryKeyField, ooid))
      } yield {
        val nameFieldNames = List("NAME")
        val name = mapper.allFields.find(f => nameFieldNames.contains(f.name)) match {
          case Some(field) => tryo(field.is.toString).openOr("")
          case _ => mapper.getClass.getName.split(".").last
        }
        Full(Audited(name, Empty))
      }) openOr Empty
    }
    case _ => Empty
  }
}

哪个有效,但它很丑陋,需要维护支持的MetaMappers列表

1 个答案:

答案 0 :(得分:1)

为什么不Audited.getSingleton?它位于Mapped类的每个实例中.....

哦,好的

因此,您有一个审计表,用于审计其他表中的更改。您应该能够转换类名,并使用与java相同的机制。但是,为什么不在Audited类和审计类之间进行一对多的映射?