加载javassist-ed Hibernate实体

Dam*_*amo 5 java hibernate jpa

我有一个JSF转换器,我用于包含几种不同实体类型的SelectItem列表.在getAsString()方法中,我创建字符串作为后缀为":"的类名和ID.

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

这允许我getAsObject()通过这样做在从UI返回的路上加载正确的实体:

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);
Run Code Online (Sandbox Code Playgroud)

我的问题是我的实体getAsString()是代理.因此,com.company.MyEntity当我执行getClass().getName()时,我得到的com.company.MyEntity_$$_javassist_48却是失败的find().

有没有办法(除了字符串操作)获取具体的类名(例如com.company.MyEntity)?

谢谢.

Chs*_*y76 9

而不是superClass.getClass()尝试org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).

  • 或者只是Hibernate.getClass() (11认同)

Dan*_*ner 6

Hibernate.getClass()HibernateProxyHelper之间有一个重要的区别!该HibernateProxyHelper总是返回使用映射表示在数据库中的表,如果你有超类和实体

@Table(name = SuperClass.TABLE_NAME)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = SuperClass.TABLE_DISCRIMINATOR, discriminatorType = DiscriminatorType.STRING)
Run Code Online (Sandbox Code Playgroud)

@DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR)
Run Code Online (Sandbox Code Playgroud)

在子类中.

Hibernate.getClass(...)返回那些真正的子类.