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)?
谢谢.
而不是superClass.getClass()尝试org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).
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(...)返回那些真正的子类.