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