我有一个如下的hibernate提取(它由线程中的synchronized方法调用)。问题是如果我在数据库控制台中将status_id更新为1,代码将无法获取它。当我在控制台中运行sql Hibernate show_sql时,它可以找到一条记录。而且,我可以看到每次通过show sql运行select sql。
要明确问题,如果我将记录状态更新为1然后启动应用程序,代码将返回一条记录,处理完成后,记录状态将更新为2.正如我所料,之后,代码将不返回任何原因,因为状态被更新为2.但是,如果我手动将状态更新为1,它将不会提取它。
从配置中可以看出,我已经关闭了二级缓存,每次都关闭会话。 我正在使用Enum来定义Hibernate连接。所以sessionFactory总是相同的实例。我不知道这是否重要,但我认为它应该是它。
dao代码是
Session session = null;
String sql = "from MyEntity rr where status_id = 1;"
try {
session = getSessionFactory().openSession();
Query q = session.createQuery(sql);
q.setMaxResults(1);
List resultList = q.list();
if (resultList.isEmpty())
return null;
return (MyEntity) resultList.get(0);
} catch (Exception e) {
LOGGER.error(e.getMessage());
} finally {
if (session != null) {
session.close();
}
}
return null;
更新状态的代码是
Session session = null;
try {
session = getSessionFactory().openSession();
session.beginTransaction();
session.update(myEntity);
session.flush();
session.getTransaction().commit();
} catch (Exception e) {
LOGGER.error(e.getMessage());
} finally {
if (session != null) {
session.close();
}
}
答案 0 :(得分:0)
如果实体不存在,则需要在其上调用save()
,否则需要调用update()
,它将修改数据库中的现有持久对象。
请注意每次调用save()都会在数据库中插入新行。您可以使用saveOrUpdate()
来实现上述save()
和update()
次操作,Hiberate将根据具体情况调用保存或更新并进行处理。
你可以在每个saveOrUpdate()之后调用flush(),这会强制Hibernate在你的数据库中执行save或update。
答案 1 :(得分:0)
我找到了解决方案。一旦我将事务放在fetch上,它就开始工作了。不知道为什么。任何人都可以解释一下吗?感谢。