7

私は、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 コンソールでクエリを表示するには - 他のクエリはログに記録されます - この更新 - ではありません

4

2 に答える 2

5

最初のスペースを削除するだけです...はい..私も信じられませんでした...「UPDATE...」から「UPDATE...」に変更します

それだけです...

于 2014-10-02T19:59:40.933 に答える
1

createSqlUpdate ステートメントの代わりに生の SQL を使用する必要があると思います。

于 2012-12-19T09:43:26.940 に答える