Я пытаюсь интегрировать Eclipse Texo в свой существующий проект Hibernate. Я смоделировал свою модель предметной области в ECore и сгенерировал оттуда код EMF и POJO, используя Texo и обычную генерацию кода EMF.
Извлечение сущностей (POJO), хранящихся в базе данных, работает без проблем, теперь я хотел бы использовать Texo ModelEMFConverter
для преобразования модели данных, отображаемой в Hibernate, в соответствующую модель EMF. Однако эта попытка терпит неудачу из-за того, что объекты, возвращаемые Hibernate, прозрачно проксируются. ModelResolver
Texo не может найти дескриптор модели для этих прокси-сущностей, поскольку он сравнивает класс сущности (который является прокси-классом) с сопоставленными классами и в моем случае терпит неудачу с исключением:
Исключение в потоке "main" java.lang.IllegalStateException: класс класса foobar.Entity_$$_jvst4f2_5 не управляется этим ModelResolver в org.eclipse.emf.texo.utils.Check.isNotNull(Check.java:66) в org .eclipse.emf.texo.model.ModelResolver.getModelDescriptor(ModelResolver.java:366) в org.eclipse.emf.texo.model.ModelResolver.getModelObject(ModelResolver.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:1 07) [...]
Соответствующие биты кода из 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);
Теоретически этот подход, кажется, работает (я проверял пошагово через код преобразования), однако он терпит неудачу для сущностей, на которые ссылаются ассоциации в моей модели данных, которые не содержатся в исходном списке entities
. Я бы хотел избежать обхода всего графа объектов вручную, чтобы избавиться от прокси.
Есть ли способ получить непрокси-объекты из Hibernate? Или у кого-нибудь может быть предложение относительно того, как я мог бы подойти к этому преобразованию модели под другим углом?
Заранее спасибо за помощь!