2012-12-18 12 views
7

Ho un'applicazione di gioco framework 2.0.4 che vuole modificare le righe in db.PlayFramework 2 + Ebean - query Sql raw di aggiornamento - non ha effetto su db

Ho bisogno di aggiornare 'alcuni' messaggi in db per lo stato "aperto" (leggere i messaggi) ho fatto come qui di seguito

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(); 

Ho modificato il PostgreSQL per registrare tutte le query.

modifiedCount è il numero effettivo di righe modificate, ma la query è in transazione. Dopo che la query è stata eseguita nel db, c'è ROLLBACK, quindi l'UPDATE non viene eseguito. Ho provato a cambiare db in H2 - con lo stesso risultato.

Questa è la query dal log di audit 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 

..........

documentazione Riproduzione quadro e documenti Ebean - afferma che non v'è nessuna transazione/se non dichiarato o transitorio se necessario per query /.

Allora ... ho fatto il trucco

Ebean.beginTransaction(); 
    int modifiedCount = update.execute(); 
    Ebean.commitTransaction(); 
    Ebean.endTransaction(); 
    Logger.info("update mod = " + modifiedCount); 

Ma questo non fa differenza - lo stesso comportamento ...

Ebean.execute(update); 

Anche in questo caso - lo stesso ..

Successivo passo ho fatto - ho annunziato il metodo con

@Transactional(type=TxType.NEVER) 

e

@Transactional(type=TxType.MANDATORY) 

Nessuno di loro ha fatto la differenza.

Sono così frustrato con Ebean :( Chiunque può aiutare, per favore

BTW ho impostato

Ebean.getServer(null).getAdminLogging().setDebugGeneratedSql(true); 
    Ebean.getServer(null).getAdminLogging().setDebugLazyLoad(true); 
    Ebean.getServer(null).getAdminLogging().setLogLevel(LogLevel.SQL); 

di vedere in console gioco query -?. Altre query vengono registrati - questo aggiornamento - non

risposta

1

io penso che si debba usare SQL prime invece di dichiarazione createSqlUpdate

4

solo rimuovere lo spazio iniziale.. ..Yes..I non poteva crederci o ... cambiamento da "UPDATE ... a" UPDATE ...

E questo è tutto ...

+0

ho avuto un problema simile, e questo l'ho risolto per me! – adis

+0

Ottimo suggerimento! Problema stupido ... –