New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SQLファイルを使った@Updateメソッドの実行時、実行がスキップされることがある。 #222
Comments
原因わかりました。ここのコードですね。 #75 の修正で共通化し過ぎてしまったようです。 |
すみません。修正を検討していましたが、1.26.0と挙動が変わっているとは言え妥当性があるので現行の仕様を維持したいと考えています。 ドキュメントには反映されていませんが、現行の仕様は次のようになっています。
アプリケーション側での対応策ですが、以下のようにしてもらうのはどうでしょうか?
|
回答ありがとうございます。 |
Javadocを確認しました。 doma/src/main/java/org/seasar/doma/Update.java Lines 105 to 115 in 319828b
includeUnchangedは、Javadocで確認する限り、sqlFileがfalseの時だけ有効である仕様のようです。 理想的には、以下の仕様の方が動きが分かりやすくて、バグを埋め込まないと思いますが、いかがでしょうか?
|
今回はJavaDocコメントが正しくないと判断しました。JavaDocコメントは次のリリースでは修正しようと思います。提案いただいたpopulateの有り無しで挙動を変える方法は検討してみたのですが、少し複雑だと(シンプルさが足りないと)感じました。
これは大変ですね。アプリケーションで次のように対応すると楽だと思います。 QueryImplementorsを実装したクラスを用意する import java.lang.reflect.Method;
import org.seasar.doma.jdbc.QueryImplementors;
import org.seasar.doma.jdbc.query.SqlFileUpdateQuery;
public class MyQueryImplementors implements QueryImplementors {
@Override
public SqlFileUpdateQuery createSqlFileUpdateQuery(Method method) {
SqlFileUpdateQuery query = new SqlFileUpdateQuery();
query.setUnchangedPropertyIncluded(true); // ここがポイント
return query;
}
} Configの実装クラスで上記クラスのインスタンスを返す public class AppConfig implements Config {
@Override
public QueryImplementors getQueryImplementors() {
return new MyQueryImplementors();
}
...
} こうすることで、既存の |
回答ありがとうございます! |
ご教示頂いた実装方法だと、自動性生成されたDapImplによって、unchangedPropertyIncludedが上書きされてしまうようです。上書きされないように、setUnchangedPropertyIncludedを無効化するか、isExecutable()が必ずtrueで返すように対応してみたいと思います。
追記:最終的にこのように実装しました。 public class MyQueryImplementors implements QueryImplementors {
private static class MySqlFileUpdateQuery extends SqlFileUpdateQuery {
public MySqlFileUpdateQuery() {
super();
unchangedPropertyIncluded = true;
}
@Override
protected void prepareExecutable() {
executable = true;
sqlExecutionSkipCause = null;
}
@Override
public void setUnchangedPropertyIncluded(Boolean unchangedPropertyIncluded) {
// unchangedPropertyIncludedプロパティの設定変更は無効化
}
}
public StrQueryImplementors() {
}
@Override
public SqlFileUpdateQuery createSqlFileUpdateQuery(Method method) {
return new MySqlFileUpdateQuery();
}
} |
おっと、そうでした 😅
👍 |
#223 で修正しました。 |
domaの1.26.0から2.19.1にアップデートする作業をしております。
バージョン2.19.1において、SQLファイルを実行する一部のUpdateメソッドを実行した際、以前は実行されたSQLの実行がスキップされるようになりました。
事象
SQLファイルを実行するUpdateメソッドを実行した結果、処理がスキップされてレコードが更新されなかった。1.26.0時点では、SQLを使った更新は、必ずSQLが実行される想定であった。
確認事項
ソースを確認すると、#75 でSqlFileUpdateQuery等に修正が入っており、更新対象のプロパティのみが更新された場合にUpdateを実行するように変更されているようにみえます。
※/*%populate */は使わないケースでも事象が発生します。
そのため、本来であればSQLが実行されることを期待するケースで実行されない事があると思われます。
ご確認の程、よろしくお願いいたします。
問題が発生する可能性のあるケース
コード抜粋
※一部マスキングしております
The text was updated successfully, but these errors were encountered: