Próbuję zintegrować Eclipse Texo z moim istniejącym projektem Hibernate. Modelowałem swój model domeny w ECore i generowałem z niego kod EMF i POJO, używając Texo i regularnego generowania kodu EMF.Eclipse Texo ModelEMFConverter i hibernacji proxy
Pobrane obiekty (POJO) przechowywane w bazie danych działają bezproblemowo, teraz chciałbym użyć Texo's ModelEMFConverter
, aby przekształcić model danych odwzorowany Hibernacja w odpowiedni model EMF. Jednak próba ta nie powiedzie się, ponieważ elementy zwrócone przez hibernację są przezroczystym serwerem proxy. Texo na ModelResolver
nie jest w stanie sprawdzić model deskryptora dla tych serwer proxy podmiotów, ponieważ porównuje klasy podmiotu (który jest klasa proxy) do odwzorowanych klas i kończy się niepowodzeniem z wyjątek w moim przypadku:
Exception w wątku "głównym" java.lang.IllegalStateException: Klasa klasy foobar.Entity _ $$ _ jvst4f2_5 nie jest zarządzany przez tego ModelResolver na org.eclipse.emf.texo.utils.Check.isNotNull (Check.java:66) pod adresem org.eclipse.emf.texo.model.ModelResolver.getModelDescriptor (ModelResolver.java:366) pod adresem org.eclipse.emf.texo.model.ModelResolver.getModelObject (ModelResol ver.java:298) w org.eclipse.emf.texo.resolver.DefaultObjectResolver.toUri (DefaultObjectResolver.java:188) w org.eclipse.emf.texo.resolver.DefaultObjectResolver.resolveToEObject (DefaultObjectResolver.java: 98) w org.eclipse.emf.texo.converter.ModelEMFConverter.createTarget (ModelEMFConverter.java:146) w org.eclipse.emf.texo.converter.ModelEMFConverter.convertSingleEReference (ModelEMFConverter.java:265) w org.eclipse.emf.texo.converter.ModelEMFConverter.convertContent (ModelEMFConverter.java:189) w org.eclipse.emf.texo.converter.ModelEMFConverter.convert (ModelEMFConverter.java:107) [...]
Odpowiednie bity kodu z ModelResolver
:
public ModelObject<?> getModelObject(final Object target) {
/* ... snip ... */
final ModelDescriptor modelDescriptor = getModelDescriptor(target.getClass(), true);
return modelDescriptor.createAdapter(target);
}
Próbowałem ręcznie rozpakowaniu proxy podmioty przed przekazaniem ich do modelu konwertera za pomocą następującego kodu:
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);
Teoretycznie to podejście wydaje się działać (sprawdziłem poprzez pojedynczy krok za pomocą kodu konwersji), ale nie działa w przypadku elementów przywoływanych przez asocjacje w moim modelu danych, które nie należą do zbioru ned na oryginalnej liście entities
. Chciałbym uniknąć konieczności przechodzenia przez cały wykres obiektów ręcznie, aby pozbyć się proxy.
Czy istnieje sposób pobierania niepowiązanych elementów z trybu hibernacji? Czy może ktoś może mieć sugestię, w jaki sposób mogę podejść do tego modelu transformacji pod innym kątem?
Dzięki za pomoc z góry!