Ich versuche, Eclipse Texo in mein bestehendes Hibernate-Projekt zu integrieren. Ich habe mein Domain-Modell in ECore modelliert und von dort sowohl EMF- als auch POJO-Code mit Texo und der regulären EMF-Code-Generierung generiert.Eclipse Texo ModelEMFConverter und Hibernate-Proxies
Das Holen von Entitäten (POJOs), die in der Datenbank gespeichert sind, funktioniert ohne Probleme, jetzt möchte ich Texo's ModelEMFConverter
verwenden, um das Hibernate-gemappte Datenmodell in das entsprechende EMF-Modell zu transformieren. Dieser Versuch schlägt jedoch fehl, da die von Hibernate zurückgegebenen Entitäten transparent proxiiert werden. Texo des ModelResolver
ist nicht in der Lage, ein Modell-Descriptor für diese proxied Entitäten zu suchen, da sie die Klasse der Einheit vergleicht (die Proxy-Klasse ist) zu den abgebildeten Klassen und schlägt mit einer Ausnahme in meinem Fall:
Exception in thread "main" java.lang.IllegalStateException: Die Klasse Klasse foobar.Entity _ $$ _ jvst4f2_5 wird nicht verwaltet dieses ModelResolver bei org.eclipse.emf.texo.utils.Check.isNotNull (Check.java:66) um org.eclipse.emf.texo.model.ModelResolver.getModelDescriptor (ModelResolver.java:366) um org.eclipse.emf.texo.model.ModelResolver.getModelObject (ModelResol ver.java:298) bei org.eclipse.emf.texo.resolver.DefaultObjectResolver.toUri (DefaultObjectResolver.java:188) bei org.eclipse.emf.texo.resolver.DefaultObjectResolver.resolveToEObject (DefaultObjectResolver.java: 98) bei org.eclipse.emf.texo.converter.ModelEMFConverter.createTarget (ModelEMFConverter.java:146) bei org.eclipse.emf.texo.converter.ModelEMFConverter.convertSingleEReference (ModelEMFConverter.java:265) bei org.eclipse.emf.texo.converter.ModelEMFConverter.convertContent (ModelEMFConverter.java:189) bei org.eclipse.emf.texo.converter.ModelEMFConverter.convert (ModelEMFConverter.java:107) [...]
Die entsprechenden Codebits aus ModelResolver
:
public ModelObject<?> getModelObject(final Object target) {
/* ... snip ... */
final ModelDescriptor modelDescriptor = getModelDescriptor(target.getClass(), true);
return modelDescriptor.createAdapter(target);
}
I versucht, die Einheiten manuell proxied Abwickeln bevor sie zu dem Modell-Wandler mit dem folgenden Code übergeben wird:
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);
In der Theorie scheint dieser Ansatz zu funktionieren (ich überprüft durch Single-Stepping durch den Conversion-Code), aber es scheitert für Entitäten, die durch Assoziationen in meinem Datenmodell referenziert werden, die nicht contai sind ned in der ursprünglichen entities
Liste. Ich möchte vermeiden, dass ich den gesamten Objektgraphen von Hand durchqueren muss, um die Proxies loszuwerden.
Gibt es eine Möglichkeit, unberechtigte Entitäten aus Hibernate abzurufen? Oder hat jemand vielleicht einen Vorschlag, wie ich diese Modelltransformation aus einem anderen Blickwinkel betrachten könnte?
Vielen Dank für Ihre Hilfe im Voraus!