Загрузка javassist-ed Hibernate лица - PullRequest
5 голосов
/ 16 июля 2009

У меня есть конвертер JSF, который я использую для списка SelectItem, содержащего несколько различных типов сущностей. В методе getAsString() я создаю строку как имя класса с суффиксом «:» и идентификатором.

MySuperClass superClass = (MySuperClass)value;
if(superClass != null) {
  return String.valueOf(superClass.getClass().getName()+":"+superClass.getId());
}

Это позволяет мне загрузить правильную сущность в getAsObject() на обратном пути из интерфейса, выполнив следующее:

String className = value.substring(0, value.indexOf(":"));
long id = Long.parseLong(value.substring(value.indexOf(":")+1));
Class<T> entitySuperClass = (Class<T>) Class.forName(className);
MySuperClass superClass = (MySuperClass)getEntityManager().find(entitySuperClass, id);

Моя проблема в том, что моя сущность в getAsString() является прокси. Таким образом, вместо получения com.company.MyEntity, когда я выполняю getClass (). GetName (), я получаю com.company.MyEntity_$$_javassist_48, поэтому на find() происходит сбой.

Есть ли какой-либо способ (кроме манипуляции со строкой) получить конкретное имя класса (например, com.company.MyEntity)?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 17 июля 2009

Вместо superClass.getClass() попробуйте org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).

6 голосов
/ 12 ноября 2009

Существует одно важное различие между Hibernate.getClass () и HibernateProxyHelper ! HibernateProxyHelper всегда возвращает суперкласс, который представляет таблицу в базе данных, если у вас есть, и сущность, которая отображается с помощью

@Table(name = SuperClass.TABLE_NAME)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = SuperClass.TABLE_DISCRIMINATOR, discriminatorType = DiscriminatorType.STRING)

и

@DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR)

в подклассе.

Hibernate.getClass (...) возвращает реальный подкласс для них.

3 голосов
/ 21 августа 2011

В сочетании с наследованием абстрактной сущности (AbstractEntity <- <code>ConcreteEntity <- <code>ConcreteEntityProxy) получение класса персистентности просто недостаточно:

// This should fail - trying to create an abstract class
HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).newInstance()

вместо этого получите класс реализации:

protected <T> T deproxy(T maybeProxy) {
    if (maybeProxy instanceof HibernateProxy) {
        return (T) ((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation();
    }
    return maybeProxy;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...