5

私はspring3.0.6、jpa 2.0、hibernate3.6.8を使用しています。私の質問は、どのような状況でjavassistを使用してEntityClassの「プロキシ」を作成するのですか?そして、このプロキシの理由は何ですか?私は次のエンティティを持っています:

@Entity
public MyEntity{
..

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

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

..
}

dbからMyEntityをロードすると、エンティティのクラスはMyEntity __ $$_javassistのようになります。なぜそれが行われるのですか?何のために?ここでは通常のクラスMyEntityだけを使用できると思います。

遅延読み込みを実装するには、次のことができます。

  • @OneToManyの場合-PersistenceBagはここで使用できます
  • @ManyToOneの場合-ここでは、Adress_ $$ _javassistのような「enchancedClass」を使用する必要があります

では、MyEntityを強化する理由は何ですか?どこでそれについてもっと読むことができますか?どの本/記事/ブログを私に勧めてもらえますか?

4

1 に答える 1

5

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

特に、JPAは、指定されたエンティティフィールドが「ダーティ」であるかどうかを認識する必要があります。これはユーザーによって変更されましたが、この変更はまだデータベースに反映されていないため、JPAはトランザクションがコミットされたときにデータベースと同期する必要があります。

もう1つのケースは、エンティティフィールドの「ロード済み」状態です。任意のフィールドを遅延読み込みに割り当てることができます。そのようなフィールドが使用されようとしているとき、JPAは、そのフィールドの値を初期化するためにデータベースクエリを実行する必要があることを認識している必要があります。

Hibernateのデフォルトは、ランタイム拡張を使用することです。プロキシは、追加のものが追加されたエンティティの単なるサブクラスです。

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

于 2012-05-20T19:50:51.297 に答える