【发布时间】: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