2009-07-16 4 views
5

いくつかの異なるエンティティタイプを含むSelectItemリストに使用するJSFコンバータがあります。 getAsString()メソッドでは、 ":"とIDの接尾辞が付いたクラス名として文字列を作成します。javassist-edのHibernateエンティティをロードしています

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

これは私がこれを行うことによって、UIからの帰りにgetAsObject()で正しいエンティティをロードすることができます:

​​

私の問題はgetAsString()の私のエンティティはプロキシであるということです。 getClass()。getName()を実行するとcom.company.MyEntityを取得する代わりにcom.company.MyEntity_$$_javassist_48を取得しているので、find()に失敗します。

具体的なクラス名(例:com.company.MyEntity)を取得する方法はありますか(文字列操作以外)?

ありがとうございました。

答えて

9

superClass.getClass()の代わりにorg.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass)を試してください。

+0

私は」 (HibernateProxy)エンティティ).getHibernateLazyInitializer()。getEntityName()またはgetPersistentClass()しかし、HibernateProxyはそれをラップして、おそらく行く方法です。 –

+11

または単にHibernate.getClass() –

+0

偉大な回答者。それは私をたくさん助けました。 – Mythul

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; 
} 
関連する問題