1

複合パターン、Item、Cluster、および Element を実装する 3 つのクラスがあります。

class Item extends Locatable {
  ...
}

class Cluster extends Item {

    static hasMany = [items:Item]

  ...
}

class Element extends Item {
  ...
}

私のドメイン モデルはこれよりも複雑ですが、これは単なる例です。Item のインスタンスがあり、それが Cluster であるか Element であるかを知りたい場合ins.getClass().getSimpleName()、奇妙なクラス名を取得してItem_$$_javassist_165います: を実行するprintln ins.toString()と、正しいクラス名が出力されます (toStringメソッドは を返しますthis.getClass().getSimpleName())。

正しいクラス名を取得するには? この"Item_$$_javassist_165"クラス名は何ですか?

4

3 に答える 3

5

この"Item_$$_javassist_165"クラス名は何ですか?

これは、あなたが持っているオブジェクトが Hibernate 遅延読み込みプロキシであることを意味します。そのオブジェクトの id 以外のものに初めてアクセスしようとすると、Hibernate はデータベースに移動して実際のデータをロードし、その後のメソッド呼び出しを実際のオブジェクトに委譲します。

の明らかなアプローチはins instanceof Cluster、別のドメイン クラスを拡張する 1 つのドメイン クラスがある場合、プロキシの存在下では正しく機能しない可能性がありますが、GORM は、必要なことを実行し、プロキシを正しく処理する注入されたinstanceOf メソッドを提供します。

if(ins.instanceOf(Cluster)) { .... }
于 2013-08-21T12:33:59.140 に答える