ORMLite を使用してバックエンド データベースに接続するアプリケーションを作成しています。アプリケーションは VPN 経由で実行されるため、データベース呼び出しを最小限に抑えようとしています。
データベース呼び出しを最小限に抑えるために、各フィールドの値をラップする一連のクラスを作成しました。各ラッパー クラスには、データベースから返された元の値と現在の値が格納されます。これにより、元の値に戻したり、値がダーティかどうかを確認したりできます (つまり、1 つ以上のフィールドがダーティな場合にのみデータベースを更新します)。
ORMLite に関するこれの意味は、ORMLite がnull
データベースにクエリを実行するときに (データベースが を返したとしてもnull
) 決して値を返さないということです。データベースに値がある場合null
、完全に初期化された「ラッパー」が返され、変数currentValue
とoriginalValue
変数が 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 つの質問があります。
- これは正しいアプローチですか?
- ORMLite関数では、null チェックを行っているようで、データベースが null を返した場合
FieldType.resultToJava
にラッパーを置き換えます。現在、パースタのメソッドをオーバーライドして true を返すことで、null
これを乗り越えています。isStreamType
これは最善のアプローチですか?後で意図しない負の副作用が発生する可能性はありますか? resultToSqlArg
カスタム パーシスタのとメソッドの違いは何ですかsqlArgToJava
。具体的には、DB から返された値をラップするためにどちらを使用すればよいでしょうか。