[英]Loading javassist-ed Hibernate entity
我有一個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_$$_javassist_48
,而不是獲取com.company.MyEntity
,因此它在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)
和
@DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR)
在子類中。
Hibernate.getClass(...)返回那些真正的子類。
當與抽象實體的繼承( AbstractEntity
< - ConcreteEntity
< - 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.