0

特定のプロパティをまったく取得しないようにマークする方法はありますか?

ユーザーテーブル内に一意のペッパー行があり、ユーザーが取得された場合にこのペッパーとハッシュ化されたパスワードをロードしたくありません。

リモートクライアントでは必要ないので、誤って渡されないようにしたいと思います。

アプリケーション サーバーでパスワードを再生成または変更する必要がある場合は、名前付きクエリを使用してペッパーを取得できます。

4

2 に答える 2

1

インターセプターを実装してonLoadメソッドをオーバーライドすることもできます: Hibernate インターセプターの詳細については、こちらを参照してください。

onFlushDirty メソッドと onSave メソッドをオーバーライドして Timestamp フィールドを更新するこの戦略を使用しました。私はそれを使用したことはありませんonLoad

これは、私が使用した同様のものに基づくインターセプターの例です(テストされていません):

public final class PepperInterceptor extends EmptyInterceptor {

    /** The Value to set as the Pepper field when loading from the DB. */
    private static final String DEFAULT_PEPPER = "[PROTECTED-PEPPER]";

    @Override
    public boolean onLoad(final Object entity, final Serializable id, final Object[] currentState,
            final Object[] previousState, final String[] propertyNames, final Type[] types) {


        if (entity instanceof User) {
            for (int i = 0; i < propertyNames.length; i++) {
                if (propertyNames[i].equalsIgnoreCase("pepper")) {
                    currentState[i] = DEFAULT_PEPPER;
                }
            }

            return true;
        }
        return super.onLoad(entity, id, currentState, previousState, propertyNames, types);
    } 

}


編集:

これについてさらに考えるとDEFAULT_PEPPER、おそらくupdatable=falseエンティティクラスの列定義のようなものを使用して、値が で上書きされないようにする必要があります

于 2012-07-16T01:08:16.427 に答える
0

Hibernate では、生成された sql を必要に応じてオーバーライドできます。

http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Annotations_Reference_Guide/entity-hibspec-customsql.html

@Loader アノテーションが役立つ場合があります。

于 2012-07-15T23:18:56.643 に答える