我有一个 play Framework 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 来记录所有查询。
moddedCount 是实际修改的行数 - 但查询处于事务中。
在数据库中完成查询后,会出现回滚 - 因此不会进行更新。
我尝试将 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)
and
@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 控制台中查看查询 - 记录其他查询 - 此更新 - 不