Как получить ссылку на объект Lift MetaMapper по имени? - PullRequest
2 голосов
/ 19 октября 2010

При моделировании таблицы аудита я включил поля, необходимые для поиска исходной проверяемой записи (oid: String, className: String).Я хотел бы программно найти MetaMapper для имени класса Mapper.

Например, если у меня есть:

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

object Foo extends Foo with MetaMapper[Foo] {
}

Учитывая строку "Foo", как бы я получить ссылкук объекту Foo?В конечном итоге я хочу ссылку на MetaMapper, чтобы я мог найти findAll.В мои дни гибернации я мог бы найти класс, использующий 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 Ответ

1 голос
/ 19 октября 2010

Почему бы не Audited.getSingleton?Это в каждом экземпляре вашего класса Mapped .....

О, хорошо

Итак, у вас есть таблица аудита, которая проверяет, что изменилось в другой таблице.Вы должны быть в состоянии преобразовать имя класса и использовать тот же механизм, который вы использовали для Java.Тем не менее, почему бы просто не отобразить один-ко-многим между аудитируемым классом и аудиторским классом?

...