2011-12-07 7 views
6

私は本当に厄介な状況に遭遇しました:私はHibernate & Springを私のアプリケーションのバックエンドとして使用していますが、特定の場合と関連するエンティティエンティティはDBから通常のエンティティオブジェクトとしてフェッチされませんが、Javassistタイプとしてフェッチされます。例:実際のHibernateエンティティタイプの代わりにJavassistタイプを取得する

私は次の関係でキャンペーンのエンティティを持っている:ディーラーのため、私は通常取得しながら、

@Entity 
@Table(name = "campaign") 
public class Campaign implements Serializable { 
    [..] 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { 
     "campaign_id", "dealer_id" }), name = "campaign_has_dealer", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dealer_id", nullable = false) }) 
    private List<Dealer> dealers = new ArrayList<Dealer>(); 

@ManyToMany 
// (fetch = FetchType.LAZY) 
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { 
     "campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "sales_area_id", nullable = false) }) 
private List<SalesArea> salesAreas = new ArrayList<SalesArea>(); 
} 

このキャンペーンに接続salesAreasを取得する際には、私は、SalesAreaのリスト_ $$ _ javassist_56を取得します休止状態のエンティティ。クライアント部分はGWTに基づいているので、私たちは物を取り出すためにRequestFactoryを使います。私は当初、それがプロキシ、ロケータなどの問題であると思っていましたが、これらを取得したサービスでブレークポイントを設定し、それらを選択した直後にJavassistオブジェクトにしました。 FetchType.LAZYアノテーションを削除しても(明らかに望ましい解決策ではありませんが)、同じことが起こるようです。これは@ManyToManyだけでなく、他の種類の関係でも起こりました。

アノテーションにGWT 2.3、Spring 3、Hibernate 3.6.3、JPA 2.0を使用しています。

何か提案がありがとうございます。私の知る限り、あなたが抱えている大きな問題は、あなたの団体のあまりフェッチタイプではなく、プロキシタイプはRequestFactoryとうまく動作しないことを見ることができるように、事前

+2

FetchType.LAZYはJPAのデフォルトです。代わりにFetchType.EAGERを指定しない限り、それを削除することは何もしません。 – viktor

答えて

4

感謝。

はい、フェッチ戦略を変更することで解決できますが、奇妙な状況に陥る可能性のある弱い回避策のように思えます。

私はそれを解決する方法を正確に覚えていませんが、私は行いました。そして、私が知っている限り、ServiceLayerDecoratorクラスには拡張ポイントがありました。基本的には、返すオブジェクトがHibernateプロキシ(HibernateクラスとHibernateProxyクラスをチェックする)かどうかをチェックしてから、ServiceLayerDecoratorの代わりに非プロキシタイプを返します。 (http://code.google.com/p/google-web-toolkit/issues/detail?id=6767

フェッチ戦略に関しては、Nが大きく(おそらく1000)、@BatchSize(N)をお勧めしますが、これは独立したテーマです。

幸運を祈る!

+1

ありがとう、あなたが送信したリンクに誰かが言ったように、解決策はカスタムServiceLayerDecoratorを実装してgetPropertyメソッドをオーバーライドすることでした。それは今働きます! :) – AndaP

0

Hibernateのプロキシモデルでは、従来のHibernateの実行時リフレクション操作が遅くなるのを避けるためにJavassistを使用することで、JDO実装のような完全なバイトコード拡張ソリューションを使用するクリーンで直感的な経験DataNucleusなど)を楽しむことができます。

個人的に私は

...ので、多くの問題を引き起こし、奇妙な、直感的な回避策が必要ですが、まだ人々が行う壊れコードについての質問でウェブを埋めるソリューションを(しゃれを許し)持続で意味を見ることはできません

しかし、問題への1つの解決策として、JPAを使用している場合、DataNucleus/JPAを使用してDataNucleus/JDOのメリット(きれいになる基盤の実装 - プロキシもJavassistクラスもありません。 JPA準拠の実装 - つまり、既存のソースコードを変更して使用する必要はありません。

1

静的メソッドを呼び出す場合: HibernateProxyHelper。getClassWithoutInitializingProxy(エンティティ); プロキシされていない場合は、プロキシエンティティのクラスとクラス自体を取得します。

関連する問題