我正在为我的公司构建一个审计框架,并试图获取从托管状态中删除时与实体一起分离的字段集合。我需要知道哪些字段设置为空客户端 -vs- 在实体分离时未加载,因此当我将其与托管实体进行比较时,我不会盲目地加载整个数据库。该实体有一个@DetachedState 字段。
有谁知道如何将 Detached State 值转换为实体上实际加载的字段的映射?
我正在为我的公司构建一个审计框架,并试图获取从托管状态中删除时与实体一起分离的字段集合。我需要知道哪些字段设置为空客户端 -vs- 在实体分离时未加载,因此当我将其与托管实体进行比较时,我不会盲目地加载整个数据库。该实体有一个@DetachedState 字段。
有谁知道如何将 Detached State 值转换为实体上实际加载的字段的映射?
在挖掘了一堆 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.");
}
}
希望这对其他人有帮助!