2

名前とアクセントなしの名前の 2 つのメイン列を持つテーブルがあります。最初のものが変更されたときに休止状態で2番目のものを更新したいと思います:

@Column(name = "name")
public String getName() {
    return this.name;
}

public void setName(String s) {
    this.name = s;
    this.noAccentName = RemoveDiacritics(name);  //remove diacritics from name
}

@Column(name = "noaccent_name")
public String getNoAccentName() {
    return this.noAccentName;
}

public void setNoAccentName(String s) {
    this.noAccentName = s;
}

これは機能していますが、オーバーヘッドがあります。名前のセッターがオブジェクトをダーティに設定し、休止状態が常に更新したい... :(

「名前」がきれいに変更されたときに「noAccentName」を更新するように休止状態に依頼するにはどうすればよいですか?

どうもありがとう。

4

5 に答える 5

3

インターセプターを見つけましたが、Hibernate 4の時点で、このようなことを行うための推奨される方法は、コールバックメソッドを使用することです。実際、Hibernate 4にはインターセプターがまったく見つからないため、そのようにするとアップグレードパスがない可能性があります。

私はあなたがしたいことはこれだと信じています:

@Column(name = "name")
public String getName() {
    return this.name;
}

public void setName(String s) {
    this.name = s;
}

@PrePersist
private void updateNoAccentName() {
    this.noAccentName = RemoveDiacritics(this.name);
}

@Column(name = "noaccent_name")
public String getNoAccentName() {
    return this.noAccentName;
}

private void setNoAccentName(String s) {
    this.noAccentName = s;
}

その後、Hibernateは、オブジェクトを保存する直前にnoAccentNameを更新する責任を負います。noAccentNameからnameに変換してアクセントを正しく取得する方法がないため、setNoAccentNameメソッドもプライベートにしたことに注意してください。

于 2012-04-20T14:00:44.157 に答える
1

私は解決策を見つけました。:) その名前は休止状態インターセプターです。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html

単純なインターセプターの助けを借りて、別のフィールドに基づいて noAccent フィールドを更新できます。

あなたの時間と労力に感謝します,

于 2012-04-20T12:19:35.730 に答える
0

簡単な方法は、プロパティアクセスの代わりに、おそらくこれら2つのプロパティに対してもフィールドアクセスを使用することです(アクセスタイプを参照してください。推奨されません)。

于 2012-04-19T21:08:15.943 に答える
0

ここではドメイン名の問題だと思います。この時点で setName を呼び出すときに名前を設定するだけではありません。両方の値を変更する changeName のような別の方法がより適切と思われます。値が常に派生している場合、名前と変更された名前の両方を永続化することにほとんど価値がないというニールの意見には同意しますが。アプリケーションが情報を使用している唯一のアプリケーションである場合は、列を削除して、分音記号を削除する別のアクセサーを提供してみませんか。

于 2012-04-19T21:22:05.370 に答える
0

Can you always derive noAccentName given the value of name? If so, you should label it and the getter and setters @Transient so that they will no longer be affected by hibernate. Just set the value of noAccentName whenever name is set and hibernate won't update that particular instance unless the value of name changes.

Edit: Alternatively you could try checking equality of the name with respect to the new one being assigned, so you don't assign any fields unless strictly necessary (which would cause hibernate to mark it as dirty). If it still updates, it's either because hibernate is configured to update regardless or because another field is being updated as well.

于 2012-04-19T12:44:56.490 に答える