2009-07-16 72 views
5

我有一個JSF轉換器,用於包含多種不同實體類型的SelectItem列表。在getAsString()方法中,我創建字符串作爲類名後綴「:」和ID。加載javassist-ed Hibernate實體

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

這讓我在路上從UI做這個加載在getAsObject()正確的實體回:

​​

我的問題是,我在getAsString()實體是一個代理。所以,而不是得到com.company.MyEntity當我做一個getClass()。getName()我得到com.company.MyEntity_$$_javassist_48所以然後它在find()失敗。

有沒有什麼辦法(除了字符串操作)來獲得具體的類名(例如com.company.MyEntity)?

謝謝。

回答

9

而不是superClass.getClass()嘗試org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass)

+0

我已經使用((HibernateProxy)實體).getHibernateLazyInitializer()。getEntityName()或getPersistentClass(),但HibernateProxy包裝,所以它可能是要走的路。 – 2009-07-17 05:25:40

6

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

當與抽象的實體的繼承組合(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; 
} 
相關問題