簡體   English   中英

加載javassist-ed Hibernate實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM