2

ストレージ機能を使用するエンティティがあります。良いのですが、このフィールド(fieldStoreFunc1、fieldStoreFunc2 ..)で必要がなく、必要な場合にのみクラスBとfieldStoreFuncsを使用する場合があります。

@Entity
@Table(name = "table")
@SequenceGenerator(name = "JDE_SEQUENCE", sequenceName = "JDE_SEQUENCE", allocationSize = 1)
public class EntityClass implements Trackable {

    @Id
    @GeneratedValue(generator = "JDE_SEQUENCE", strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column(name = "name_field")
    private String field1;


    @Column(name = "name_field")
    private String field2;

    @Column(name = "name_field")
    private String field3;
    ......

    //read only fields
    @Formula("store_func(value)")
    private String fieldStoreFunc1;

    @Formula("store_func(value)")
    private String fieldStoreFunc2;

    @Formula("store_func(value)")
    private String fieldStoreFunc3;
}

だから私はクラスをに分割できますか

class A{
    @Column(name = "name_field")
        private String field1;


        @Column(name = "name_field")
        private String field2;

        .....
}

class B extends A{
        //read only fields
        @Formula("store_func(value)")
        private String fieldStoreFunc1;

        @Formula("store_func(value)")
        private String fieldStoreFunc2;

        @Formula("store_func(value)")
        private String fieldStoreFunc3;
}
4

2 に答える 2

2

いいえ、それはあなたがすべき方法ではありません。

まず、これらの追加の3つのフィールドをロードすると、重大なオーバーヘッドとパフォーマンスの問題が発生することを測定、プロファイリング、および証明します。

この証明が得られたら、ドキュメントで説明されているように、追加の3つのフィールドを遅延読み込みすることを検討してください。次に、もう一度測定し、これら3つのフィールドの遅延読み込みによって、さらに大きなオーバーヘッドとパフォーマンスの問題が発生しないことを証明します。

ドキュメントに記載されているように:

Hibernate3は、個々のプロパティの遅延フェッチをサポートしています。この最適化手法は、フェッチグループとも呼ばれます。これは主にマーケティング機能であることに注意してください。行読み取りの最適化は、列読み取りの最適化よりもはるかに重要です。ただし、極端な場合には、クラスの一部のプロパティのみをロードすると便利です。たとえば、レガシーテーブルに数百の列があり、データモデルを改善できない場合です。

store_func式が非常に高価でない限り、おそらく何も最適化しようとしないでください。

于 2012-09-22T13:32:18.300 に答える
0

JB Nizetあなたがまだ要求に応じてそれらのプロパティをロードする気があるかどうか私は同意しますが。そして、記録のためだけに。

あなたはいくつかの方法で達成することができます。より単純な方法は、常にロードしたいプロパティを使用してクラスにコンストラクターを作成することです。

Please Note that is just an example and is not properly developed

public class A {
  ...
  @Column(name = "name_field")
  private String field1;

  @Formula("store_func(value)")
  private String fieldStoreFunc1;

  ...
  public A(String id, String field1) {
     this id = id; 
     this.field1 = field1;
  }

そして、次のDAOようなエンティティをロードする関数を作成します

public class DAO {
    getLight(Long id) {
       String named_query = "select a.id, a.field1 from A a where a.id = :id"
       // Execute query
    }

もう1つの方法はHibernate event、カスタムエンティティローダーを確認するか、作成することです。

于 2012-09-22T13:45:34.410 に答える