1

私は自分の会社の監査フレームワークを構築しており、管理状態から削除されたときにエンティティとともに切り離されたフィールドのコレクションを取得しようとしています。どのフィールドがnullクライアント側-vs-に設定されているかを知る必要があります。これは、エンティティがデタッチされたときにロードされなかったため、管理対象エンティティと比較したときに、データベース全体を盲目的にロードするだけではありません。エンティティには@DetachedStateフィールドがあります。

Detached State値を、エンティティに実際にロードされたフィールドのマップに変換する方法を知っている人はいますか?

4

1 に答える 1

1

OpenJPAコードの山を掘り下げた後、なんとかこれを解決することができました。これはおそらく最も洗練されたコードではなく、おそらく必要な安全性チェックがありませんが、この時点で作業は完了します。

    final PersistenceCapable pc = ((PersistenceCapable) detachedEntity);
    final Object[] state = (Object[]) pc.pcGetDetachedState();
    final BitSet loadedFieldsOnDetach = (BitSet) state[1];

    final OpenJPAEntityManager oem = getEntityManager();
    final Broker _broker = ((EntityManagerImpl) oem).getBroker();
    final ClassMetaData meta = _broker.getConfiguration().getMetaDataRepositoryInstance()
            .getMetaData(ImplHelper.getManagedInstance(detachedEntity).getClass(), _broker.getClassLoader(), true);

    for (final FieldMetaData fmd : meta.getDefinedFields()) {
        if (loadedFieldsOnDetach.get(fmd.getIndex())) {
            System.out.println(fmd.getName() + " was loaded on detach.");
        }
    }

これが他の誰かに役立つことを願っています!

于 2013-03-05T21:24:17.027 に答える