1

私のアプリケーションには、次のようないくつかの監査済みエンティティ クラスがあります。
さまざまな休止状態の注釈を持つ他のエンティティへの複数の HAS-IS 関係が含まれています。

@実在物
@監査済み
public class Entity は Serializable {

    private static final long serialVersionUID = 1L;

    @ID
    プライベート整数 ID;

    にゃんにゃん
    プライベート セット < 国> 影響を受ける国;

    @OneToOne
    プライベート インパクト インパクト;

    @列挙型(EnumType.STRING)
    個人の所有者

    ...
}

監査テーブル エンティティからすべての属性値を返す次のコード スニペットを使用して、監査証跡を分析しています。

public List< AuditTrailForm> getAuditTrailEntries(Class< ?> clazz, Serializable id) {
        AuditReader リーダー = AuditReaderFactory.get(this.getSession());
        List < Number> revNumbers = reader.getRevisions(clazz, id);
        List< AuditTrailForm> フォーム = new ArrayList();
        Iterator< Number> it = revNumbers.iterator();

        while(it.hasNext()) {

            番号項目 = it.next();
            Object obj = reader.find(clazz, id, item);
            AuditInfo リビジョン = reader.findRevision(AuditInfo.class, item);

            BeanMap beanMap = new BeanMap(obj);
            HashMap マップ = 新しい HashMap();

            キーを設定 = beanMap.keySet( );
            イテレータ keyIterator = keys.iterator( );

            while( keyIterator.hasNext( ) ) {
               String propertyName = (String) keyIterator.next( );

                if (beanMap.getType(propertyName).equals(String.class)) {
                   String propertyValue = (String) beanMap.get( propertyName );
                      map.put(propertyName, propertyValue);  
                }
            }   
            Date createdAt = Revision.getTimestamp();
            文字列ユーザー = Revision.getUser();

            AuditTrailForm フォーム = 新しい AuditTrailForm(user, createdAt, map);
            forms.add(フォーム);
        }
        返品フォーム;
}

正常に動作しますが、これはクラス内のリレーションをトラバースすることを考慮していません。
オブジェクト属性のタイプを検出してから再帰呼び出しを行う再帰アルゴリズムを何らかの方法で開発できますか?
これを完全に行うためのより良い方法はありますか?

4

1 に答える 1

2

より簡単なアプローチ...

オブジェクトツリーへの保存はトランザクションで発生すると想定しています。監査テーブルを変更して、トランザクションごとに一意の識別子を追加することもできます。

そうすれば、変更セットのコレクションとして監査履歴を参照できます。たとえば、単一のトランザクションで行われたすべての変更を確認できます。

あなたが求めているものとはまったく異なりますが、達成するのがはるかに簡単で、多くの利点を提供します。あなたが求めているものは、実装するのが非常に複雑になります。

于 2010-07-28T21:42:25.607 に答える