【问题标题】:hibernate returning null for auto-generated timestamps from mysqlhibernate为从mysql自动生成的时间戳返回null
【发布时间】:2014-07-02 01:07:57
【问题描述】:

我在 mysql 中有一个表,它的数据类型为时间戳作为列之一,插入时它的默认值是 CURRENT_TIME。我有另一个时间戳列,更新时默认值为 CURRENT_TIME。我有这些,以便时间戳列在插入和更新时自动更新(效果很好)。

现在我正在使用 cxf、hibernate/jpa、mysql、jackson 来构建 Web 服务。 我只是创建一个新记录并立即检索它,如下代码所示。

Session session = getSession();  // sessionFactory.getCurrentSession();
String accountId = (String)session.save(account);
Account newAccount = (Account)session.load(Account.class, accountId);
logger.info("created timestamp=" + newAccount.getCreatedTimestamp());

运行上述代码后,我可以看到在 mysql 中创建了新记录,并为 createdTimestamp 提供了正确的时间戳。但是,上面的 logger.info() 行会引发异常,因为 newAccount.getCreatedTimestamp() 返回 null。如果我删除 logger.info() 行,我可以看到 newAccount 对象填充了正确的值,但 createdTimestamp 为空。

更奇怪的是,在上面的代码运行之后(这是 HTTP POST 操作的一部分),我调用了一个 HTTP GET 服务,它只是获取我刚刚插入的记录

session.get(Account.class, accountId);

它正确显示了时间戳!

我试图在 session.load() 或 session.get() 之前睡觉,认为插入时间戳可能会有延迟,但这并没有多大作用。休眠会话管理有什么特别之处,它不会检索 mysql 生成的列吗?我在这里想念什么?请帮忙。

【问题讨论】:

  • 你可以试试Session的public void evict(Object object);方法让hibernate重新加载对象。
  • 感谢领导。您的评论使我了解了 session 的其他功能,例如 flush()、refresh()、evict() 等。现在在保存后刷新然后刷新给我正确的时间戳!

标签: java mysql hibernate timestamp jackson


【解决方案1】:

在刷新会话之前,您的实际保存不会被提交。在会话被刷新或关闭之前,Hibernate 实际上不会向数据库提交任何内容,因此如果抛出异常,回滚实际上不必触及物理数据库,只是不会发送更改。但是,如果 Hibernate 检测到某个查询将接收陈旧数据,它将在运行该查询之前自动刷新。

例如,您向数据库添加一条记录并立即调用SELECT COUNT(*) 查询。 Hibernate 将刷新会话(在此过程中提交记录),然后对现在干净的会话执行SELECT COUNT(*) 查询,以确保您获得正确的数据。 Hibernate 在您的情况下没有这样做,因为它看到您正在请求您尝试插入的相同对象(在同一会话中),因此它只是返回了该引用。

如果您让 hibernate 管理其会话(使用会话工厂或类似方法),我认为您不必明确关闭会话。我知道我不知道,但我将 Hibernate 与 Spring 结合使用,并使用管理实际 Hibernate 会话的 @Transactional 注释。如果您想要立即插入,请在方法中的最后一次调用中调用 save()。通常,一旦方法退出,会自动调用commit()

所有load() 将做的就是为您提供与您传递给session.save() 相同的Account 实例。关闭或刷新会话,然后再次尝试load(),您的值应该被设置。

【讨论】:

  • 这行得通!我做了 save()、flush() 和 refresh()。使用 load()、get() 或 refresh() 之间是否有任何性能指标?另外,如果我想立即插入,我总是需要冲洗吗?最后,完成后是否必须明确关闭会话?
  • 查看我的答案的更新。我添加了更多细节来解决您的问题。
  • 谢谢,这真的很有帮助。尤其是角色回馈场景。
  • 也衷心祝贺您使您的第一个 SO 帖子真正可回答,而不仅仅是 2 行请求模糊帮助。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2017-11-03
  • 2020-07-15
  • 1970-01-01
  • 2018-07-09
  • 2011-06-14
  • 2011-11-18
  • 2014-01-27
相关资源
最近更新 更多