2012-05-16 10 views
5

私はspring 3.0.6、jpa 2.0、hibernate 3.6.8を使用しています。 私の質問は、javassistがEntityClassの "プロキシ"を作成するためにどのような状況で使用されているのですか?そして、このプロキシの理由は何ですか? 私は、次のエンティティがあります。私は、DBからMyEntityをロードエンティティクラスはいつ強化されますか? jpa、spring、hibernate、javassist

@Entity 
public MyEntity{ 
.. 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "adresseID") 
    private Adresse adresse; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "myEntity") 
    private List<Parameter> parameters; 

.. 
} 

、エンティティのクラスがMyEntity __ $$ _ Javassistのようなものです。どうしてですか?何のために?私はここで普通のクラスのMyEntityを使うことができると思います。

遅延ロードを実装するために、私たちすることができます:@OneToManyため

  • - PersistenceBagは@ManyToOneのためにここに
  • 使用することができます - ここAdress_ のような "enchancedClass" を使用する必要があります。$$ _javassist

MyEntityをエンハンシングする理由は何ですか?私はそれについてもっと何かを読むことができますか?どの本/記事/ブログを私におすすめできますか?

答えて

4

エンティティクラスが拡張される主な理由は、JPA(またはHibernate)がエンティティオブジェクトの状態を追跡する必要があるという主な理由です。

特定のエンティティフィールドが「ダーティ」(ユーザーによって変更されたが、この変更がまだデータベースに反映されていないため、JPAがトランザクションコミット時にデータベースと同期する必要がある)

もう1つのケースは、エンティティフィールドの「ロード済み」状態です。どのフィールドにもレイジーロードを割り当てることができます。このようなフィールドが使用されると、JPAはそのフィールドの値を初期化するためにデータベース照会を実行する必要があることを認識しなければなりません。

Hibernateのデフォルトは、ランタイムエンハンスメントを使用することです - プロキシはエンティティのサブクラスであり、余計なものが追加されています。

いくつかの一般的な考え方については、hereを概説しています。

関連する問題