我試圖將Eclipse Texo集成到我現有的Hibernate項目中。我在ECore中建模了我的領域模型,並使用Texo和常規的EMF代碼生成從那裏生成了EMF和POJO代碼。Eclipse Texo ModelEMFConverter和Hibernate代理
存儲在數據庫中的抓取實體(POJO)沒有問題,現在我想用Texo的ModelEMFConverter
將Hibernate映射的數據模型轉換爲相應的EMF模型。但是,由於Hibernate返回的實體被透明地代理,所以此嘗試失敗。 TEXO的ModelResolver
無法查找一個模型描述了這些代理機構,因爲它的類的實體(這是代理類)進行比較,以映射類和失敗,在我的情況例外:
異常在線程「主」java.lang.IllegalStateException:類 類 foobar.Entity _ $$ _ jvst4f2_5 不受此ModelResolver管理在 org.eclipse.emf.texo.utils.Check.isNotNull(Check.java:66 )at org.eclipse.emf.texo.model.ModelResolver.getModelDescriptor(ModelResolver.java:366) at org.eclipse.emf.texo.model.ModelResolver.getModelObject(ModelResol ver.java:298) 在 org.eclipse.emf.texo.resolver.DefaultObjectResolver.toUri(DefaultObjectResolver.java:188) 在 org.eclipse.emf.texo.resolver.DefaultObjectResolver.resolveToEObject(DefaultObjectResolver.java: 98) 在 org.eclipse.emf.texo.converter.ModelEMFConverter.createTarget(ModelEMFConverter.java:146) 在 org.eclipse.emf.texo.converter.ModelEMFConverter.convertSingleEReference(ModelEMFConverter.java:265) 在 org.eclipse.emf.texo.converter.ModelEMFConverter.convertContent(ModelEMFConverter.java:189) 在 org.eclipse.emf.texo.converter.ModelEMFConverter.convert(ModelEMFConverter.java:107) [...]
從ModelResolver
相關的代碼位:
public ModelObject<?> getModelObject(final Object target) {
/* ... snip ... */
final ModelDescriptor modelDescriptor = getModelDescriptor(target.getClass(), true);
return modelDescriptor.createAdapter(target);
}
我嘗試使用下面的代碼它們傳遞給模型變換之前手動展開的代理機構:
final List<Object> objects = entities
.stream()
.map(o ->
o instanceof HibernateProxy ?
(Entity) ((HibernateProxy) o).getHibernateLazyInitializer().getImplementation() : o)
.collect(Collectors.toList());
final ModelEMFConverter converter = new ModelEMFConverter();
final Collection<EObject> eObjects = converter.convert(objects);
理論上這種方法似乎可行(我通過單步執行轉換代碼檢查),但是在我的數據模型中由關聯引用的實體失敗, ned在原來的entities
列表中。我想避免必須手動遍歷整個對象圖,以擺脫代理。
有沒有辦法從Hibernate檢索未加載的實體?或者,有沒有人可能會對我如何從不同角度進行模型轉換提出建議?
感謝您的幫助提前!