0

ORMLite を使用してバックエンド データベースに接続するアプリケーションを作成しています。アプリケーションは VPN 経由で実行されるため、データベース呼び出しを最小限に抑えようとしています。

データベース呼び出しを最小限に抑えるために、各フィールドの値をラップする一連のクラスを作成しました。各ラッパー クラスには、データベースから返された元の値と現在の値が格納されます。これにより、元の値に戻したり、値がダーティかどうかを確認したりできます (つまり、1 つ以上のフィールドがダーティな場合にのみデータベースを更新します)。

ORMLite に関するこれの意味は、ORMLite がnullデータベースにクエリを実行するときに (データベースが を返したとしてもnull) 決して値を返さないということです。データベースに値がある場合null、完全に初期化された「ラッパー」が返され、変数currentValueoriginalValue変数が null に設定されます。

これを行う適切な場所は、次のようなカスタム永続化プログラムにあるようです (StatefulIntegerPropertyのラッパーはどこにありますかInteger):

public class StatefulIntegerPersister extends BaseDataType {

    ... misc. other code

    @Override
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
        Integer result = results.getInt(columnPos);
        return new StatefulIntegerProperty((results.wasNull(columnPos)) ? null : result);
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException {
        return sqlArg;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object obj) throws SQLException {
        return ((StatefulIntegerProperty)obj).getCurrentValue();
    }

    @Override
    public boolean isStreamType() {
        return true; // this is a hack to work around ORMLite setting the value to null in the FieldType.resultToJava function
    }
}

3 つの質問があります。

  1. これは正しいアプローチですか?
  2. ORMLite関数では、null チェックを行っているようで、データベースが null を返した場合FieldType.resultToJavaにラッパーを置き換えます。現在、パースタのメソッドをオーバーライドして true を返すことで、nullこれを乗り越えています。isStreamTypeこれは最善のアプローチですか?後で意図しない負の副作用が発生する可能性はありますか?
  3. resultToSqlArgカスタム パーシスタのとメソッドの違いは何ですかsqlArgToJava。具体的には、DB から返された値をラップするためにどちらを使用すればよいでしょうか。
4

1 に答える 1

1

これは正しいアプローチですか?

あなたがここで行っていることがデータベース呼び出しを最小限に抑える理由がわかりません。ユーザーのメーリング リストでディスカッションを開始できますか?

resultToSqlArg(...)が必要だと思うときに、メソッドをオーバーライドしていますsqlArgToJava(...)。下記参照。

現在、パーシスタの isStreamType メソッドをオーバーライドして true を返すようにすることで、これを乗り越えています。これが最善のアプローチですか...

うーん。動作する場合は問題ありませんが、この設定をこのように使用するのは危険です。メソッドの動作を変更するとisStreamType()、コードが壊れる可能性があります。少なくとも、ORMLite をアップグレードすると壊れるこの動作を確認するための単体テストが必要です。

nullそうは言っても、特に true の場合の値の周りのコードには適切な処理がありisStreamType()ます。

resultToSqlArg と sqlArgToJava の違いは何ですか...

これらの javadoc を肉付けしました。

  • resultToSqlArgSQL の結果からオブジェクトを取得し、それを SQL コマンドの引数に適した Java オブジェクトに変換します。たとえば、date-long 型のLong場合、データベースの結果から値が抽出されます。
  • sqlArgToJavasql-arg 値を受け取り、それを Java フィールドに変換します。たとえば、date-long 型の場合、これは値を取得し、エンティティ フィールドに一致Longする に変換します。Date

ではなくをオーバーライドする必要があるsqlArgToJavaと思います。resultToSqlArg

于 2013-03-28T17:17:25.007 に答える