У нас есть некоторый критический код платформы, так как платформа загружает пользовательские компоненты Hibernate, когда пользователь выполняет редактирование на веб-странице. Код выглядит так:
@Override
public <T> boolean isManaged(Class<T> paramTypeToCreate) {
EntityManager entityManager = Em.get();
try {
ManagedType<T> managedType = entityManager.getMetamodel().managedType(paramTypeToCreate);
EntityTypeImpl<T> entityType = (EntityTypeImpl<T>) managedType;
if(!entityType.hasSingleIdAttribute()) {
log.warn("You generally should be using beans with hibernate ids since this is a hibernate class");
return false; //if no single id attribute, let the default creator create the bean
}
} catch(IllegalArgumentException e) {
return false;
}
return true;
}
Мы не хотели зависеть от такого низкоуровневого кода, но это был единственный способ узнать, управлялся ли входящий класс управлением в спящем режиме или нет, и затем искать Атрибут id, чтобы мы могли загрузить объект. Есть ли новый (надеюсь, более опубликованный c api) для предоставления hibernate класса (ie. Bean.getClass ()) и запроса hibernate, управляет ли он этим как bean-компонента hibernate, а затем спрашивает атрибут has single id. Это специально для версии 5.4.10.
Мы находимся на версии 5.3.2 и пытаемся выполнить обновление.
Чтобы добавить дополнительные сведения, мы убедимся, что этот код будет работать после загрузить объект по его идентификатору
EntityManager entityManager = Em.get();
Metamodel metamodel = entityManager.getMetamodel();
ManagedType<T> managedType = metamodel.managedType(paramTypeToCreate);
EntityTypeImpl<T> entityType = (EntityTypeImpl<T>) managedType;
Class<?> idClazz = entityType.getIdType().getJavaType();
SingularAttribute<? super T, ?> idAttribute = entityType.getId(idClazz);
String name = idAttribute.getName();
спасибо, Дин