手动更改后恢复数据库记录

时间:2008-10-16 01:36:20

标签: java mysql tomcat5.5 hibernate3

问题解决了:谢谢大家,请看下面的答案。

我在Tomcat 5.5中运行的网站使用Hibernate3连接到MySQL5数据库。

一条记录只是拒绝对其进行任何更改。如果我以编程方式更改记录,则值将恢复为之前的值。

如果我手动修改数据库中的记录,则值将恢复(似乎一旦webapp访问它们)。

我尝试停止Tomcat并手动更改值,然后再次启动Tomcat。检查数据库后,Tomcat启动Web应用后值仍会更改,但在加载站点后将再次恢复。

我还尝试删除webapp和.ser缓存文件的Tomcat工作文件夹。

我还检查了代码中的值,这些值正被还原为无法找到它们。

我只在这一个特定记录中注意到了它。

编辑:我刚看了一下使用hibernate.show_sql = true的Hibernate的SQL输出。我的行所在的表中记录了更新查询。有谁知道如何解决?列到实际值?

6 个答案:

答案 0 :(得分:1)

您可以暂时启用mysql查询日志记录,并确切了解sql语句更改了该值的内容。既然你说它在服务器启动后立即发生了变化,你应该能够很快找出语句。

http://dev.mysql.com/doc/refman/5.0/en/query-log.html

答案 1 :(得分:1)

回答你的问题:

  

有谁知道如何解决?   列到实际值?

您可以使用p6spy执行此操作。有关如何在Spring应用程序中进行设置的说明可用here

但是,我认为这些说明中存在错误,他们称为p6spy.log的文件实际上应该是名称p6spy.properties。

答案 2 :(得分:0)

它已接近万圣节,所以你不得不期待这种事情(加上它只是一个满月),但我一直在寻找网络应用程序中的罪魁祸首...它必须在那里。我会立即在webapp源代码中搜索一些值:

  • 正在更改记录的ID。
  • 正在写入的值 记录。
祝你好运......这些真的可以找到它们!

答案 3 :(得分:0)

这有点像启动时的测试用例,它会在测试之前将行修改为预期的行。

答案 4 :(得分:0)

在BEFORE UPDATE之前添加一个触发器,检查行ID,如果它与您的魔术行匹配则引发SQL错误。 然后检查生成的堆栈跟踪,遍历代码并找到更新行的部分。

答案 5 :(得分:0)

感谢大家的帮助。所有这些建议都可以用来追踪它。

我设法找出导致它的原因。糟糕的数据库设计,多种数据模型和Hibernate使得一些讨厌的东西。另一个表存储了值,该类正在扩展具有相同值的基类。

时间考虑做一些规范化。