2

Hibernate と MySQL を使用して、Eclipse IDE の使用に関する多くのトレース データを保存する Java プログラムがあります。このデータには、メソッド名、ディレクトリ、パースペクティブ名などの多くの文字列が含まれています。

たとえば、イベント オブジェクト (レコードに反映される) は、ソース ファイルと現在のメソッド、ユーザー名などを指定できます。明らかに、文字列データ自体を繰り返すことができます。

メモリ内にある限り、その多くは内部化されるため、繰り返されるすべての文字列インスタンスは同じオブジェクトを指します (私はそれを確認しています)。ただし、@Basic (私は注釈を使用します) を使用すると、Hibernate はそれを VARCHAR(255) にマップします。これは、多くの無駄なスペースを意味します。

自分で SQL をコーディングしていた場合、VARCHAR を手動で管理された文字列ルックアップ テーブルへのインデックスに置き換えて、スペースを節約できたはずです (追加のルックアップを犠牲にして)。

Hibernate にこれを実行させる方法はありますか? スペースのパフォーマンス ヒットを喜んで支払います。

4

3 に答える 3

1

sblundyの答えに基づいて構築すると、おそらく次のようなもので逃げることができます:

class Foo {
    // client code uses this to get the value... ignored by Hibernate
    @Transient
    public String getString() {
        return getStringHolder().getString();
    }

    public StringHolder getStringHolder() {...}
}

少なくとも、クライアント コードは必ずしも変更を認識する必要はありません。でも、苦労する価値があるかどうかはわかりません。

于 2008-09-27T23:21:48.307 に答える
0

カスタム値の型を見たいと思います。これにより、文字列を整数 ID としてデータベースに保存できるようになります。もちろん、マッピング/ルックアップを自分で提供する必要があります。

于 2008-10-06T02:02:30.200 に答える
0

文字列ホルダー オブジェクトが必要になり、これらすべてのオブジェクトがそれを参照していることを確認してください。

class StringHolder {
  private Long id;
  private String string;

  public StringHolder() {/* Not sure if this is necessary */}

  public StringHolder(String string) {
    this.string = string;
  }

  public void getString() {
    return this.string;
  }
}
于 2008-09-27T22:57:43.763 に答える