1

我正在为我的公司构建一个审计框架,并试图获取从托管状态中删除时与实体一起分离的字段集合。我需要知道哪些字段设置为空客户端 -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 回答