陈旧的Hibernate createSQLQuery

时间:2011-11-18 07:47:14

标签: java mysql hibernate

我有一个从共享的mysql数据库读取的项目。会话中有一个大型帐户对象(太大,但这是另一个故事)。

问题是这个对象有一个blance字段,由同一台机器上的不同进程借记。因此,用户可以看到20英镑的余额,但实际上他们的平衡可能要低得多。应用无法知道此值何时发生变化。

所以我想我每次都要求我从数据库中获取值时检查mysql,但是它是通过faces,所以当它询问时会多次询问,所以我进行检查以便如果它没有要求几秒钟,只在天平上做一个createSQLquery来查看它是否不同,如果是,则重新加载对象。

所以我按照以下方式做了一些事情:

sess.createSQLQuery("SELECT Balance from Account").list();

并获得价值。有些时候它会显示正确的平衡,但通常会显示以前读取的余额,其中mysql命令行客户端显示实际值。

是否有办法清除此值或更新对象的其他方法?我想最终删除hibernate,因为它会导致我解决更多的问题,但目前,我只需要余额来显示基于数据库的值。

3 个答案:

答案 0 :(得分:1)

您可以尝试在休眠会话中重新加载该对象。 http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html

sess.refresh(yourReadObject);

可能会清除会话

sess.clear();

也可以提供帮助。然而,它可能有更多的副作用。

答案 1 :(得分:1)

由于你无论如何都计划放弃休眠,你可以直接使用JDBC连接绕过hibernate会话,而不会影响其他任何事情。

Connection con = getSession().connection();
PreparedStatement s = con.prepareStatement("...");
s.setString(1, "...");
ResultSet rs = s.executeQuery();

答案 2 :(得分:0)

我发现确定的唯一方法就是在获得hibernate会话后从其中删除所有对象。

这意味着在执行上述语句之后,您需要单独逐出每个对象,因为对象似乎不起作用而逐出清单。 (下面假设对象名称)

for(Balance b : listOfBalances) {
    hibernateSession.evict(b);
}

我怀疑这是最好的方法(我不是hibernate专家),但这是我找到的唯一方法,你可以100%确定你不会收到陈旧的对象。 (我知道这个回复有点晚,但希望它可以帮到某人)