2

監査テーブルのモデリングでは、監査対象の元のレコードを見つけるために必要なフィールドを含めました (oid: 文字列、クラス名: 文字列)。Mapper クラス名の MetaMapper をプログラムで見つけたいと思います。

たとえば、私が持っている場合:

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

object Foo extends Foo with MetaMapper[Foo] {
}

文字列「Foo」が与えられた場合、オブジェクト Foo への参照を取得するにはどうすればよいですか? 最終的には、findAll を実行できるように MetaMapper への参照が必要です。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 のリストを維持する必要があります

4

1 に答える 1

1

なぜAudited.getSingletonですか?Mapped クラスのすべてのインスタンスにあります.....

ああ、わかりました

したがって、他のテーブルで何が変更されたかを監査する監査テーブルがあります。クラス名を変換し、Java で使用したのと同じメカニズムを使用できるはずです。しかし、Audited クラスと audit クラスの間に 1 対多のマッピングを持たないのはなぜでしょうか?

于 2010-10-19T13:56:19.233 に答える