私は、db の行を変更したい play フレームワーク 2.0.4 アプリケーションを持っています。
データベースの「少数」のメッセージを「開封済み」のステータスに更新する必要があります(メッセージを読む)以下のようにしました
String sql = " UPDATE message SET opened = true, opened_date = now() "
+" WHERE id_profile_to = :id1 AND id_profile_from = :id2 AND opened IS NOT true";
SqlUpdate update = Ebean.createSqlUpdate(sql);
update.setParameter("id1", myProfileId);
update.setParameter("id2", conversationProfileId);
int modifiedCount = update.execute();
すべてのクエリをログに記録するように postgresql を変更しました。
modifiedCount は変更された行の実際の数ですが、クエリはトランザクション中です。データベースでクエリが実行された後、ROLLBACK があるため、UPDATE は行われません。db を H2 に変更しようとしましたが、結果は同じでした。
これは postgres 監査ログからのクエリです
2012-12-18 00:21:17 CET : S_1: BEGIN
2012-12-18 00:21:17 CET : <unnamed>: UPDATE message SET opened = true, opened_date = now() WHERE id_profile_to = $1 AND id_profile_from = $2 AND opened IS NOT true
2012-12-18 00:21:17 CET : parameters: $1 = '1', $2 = '2'
2012-12-18 00:21:17 CET : S_2: ROLLBACK
..........
Play フレームワークのドキュメントと Ebean のドキュメント - トランザクションは存在しない / 宣言されていない場合、またはクエリごとに必要な場合は一時的であると述べています。
だから...私はトリックを作りました
Ebean.beginTransaction();
int modifiedCount = update.execute();
Ebean.commitTransaction();
Ebean.endTransaction();
Logger.info("update mod = " + modifiedCount);
しかし、これは違いはありません - 同じ動作...
Ebean.execute(update);
再び-同じ..
私が行った次のステップ - メソッドに注釈を付けました
@Transactional(type=TxType.NEVER)
と
@Transactional(type=TxType.MANDATORY)
それらのどれも違いをもたらしませんでした。
私はEbeanにとてもイライラしています:(誰か助けてください?
ところで。設定しました
Ebean.getServer(null).getAdminLogging().setDebugGeneratedSql(true);
Ebean.getServer(null).getAdminLogging().setDebugLazyLoad(true);
Ebean.getServer(null).getAdminLogging().setLogLevel(LogLevel.SQL);
Play コンソールでクエリを表示するには - 他のクエリはログに記録されます - この更新 - ではありません