我有一个 JSF 转换器,用于包含多种不同实体类型的 SelectItem 列表。在 getAsString()
方法中,我将字符串创建为后缀为“:”的类名和 ID。
MySuperClass superClass = (MySuperClass)value;
if(superClass != null) {
return String.valueOf(superClass.getClass().getName()+":"+superClass.getId());
}
这允许我在从 UI 返回的过程中在 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()
中的实体是一个代理。因此,当我执行 getClass().getName() 时,我没有获取 com.company.MyEntity
,而是获取了 com.company.MyEntity_$$_javassist_48
,因此它失败了find()
。
有什么方法(除了字符串操作之外)获取具体的类名(例如 com.company.MyEntity)?
谢谢。
最佳答案
尝试使用 org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass)
而不是 superClass.getClass()
。
关于java - 加载 javassist-ed Hibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1139611/