Java hibernate为mysql自动生成的时间戳返回null

Java hibernate为mysql自动生成的时间戳返回null,java,mysql,hibernate,timestamp,jackson,Java,Mysql,Hibernate,Timestamp,Jackson,我在mysql中有一个表,其中一列的数据类型是timestamp,插入时会得到默认值CURRENT_TIME。我还有另一个timestamp列,它的默认值是更新时的CURRENT_TIME。我有这些,这样时间戳列将在插入和更新时自动更新(这很好) 现在我正在使用cxf、hibernate/jpa、mysql和jackson来构建web服务。 我只是创建一个新记录并立即检索它,如下代码所示 Session session = getSession(); // sessionFactory.get

我在mysql中有一个表,其中一列的数据类型是timestamp,插入时会得到默认值CURRENT_TIME。我还有另一个timestamp列,它的默认值是更新时的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除外,该值为null

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

session.get(Account.class, accountId);
它正确地显示了时间戳


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

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

例如,将记录添加到数据库中,并立即调用
selectcount(*)
query。Hibernate将刷新会话(在进程中提交记录),然后对现在已清除的会话执行
SELECT COUNT(*)
查询,确保获得正确的数据。Hibernate在您的案例中没有这样做,因为它看到您请求的对象与您尝试插入的对象相同(在同一个会话中),所以它只是返回了该引用

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


所有的
load()
将给你传递到
session.save()
Account
实例。关闭或刷新会话,然后再次尝试
load()
,应该设置您的值

您可以尝试会话的公共无效收回(对象);方法让hibernate重新加载对象。感谢您的指导。您的评论使我了解了会话的其他功能,如flush()、refresh()、execute()等。现在,保存后刷新,然后刷新给了我正确的时间戳!这管用!我确实保存了()、刷新了()和刷新了()。在使用load()、get()或refresh()之间是否有任何性能指示?另外,如果我想立即插入,我总是要刷新吗?最后,完成后是否必须明确关闭会话?请参阅我答案的更新。我补充了一些细节来回答你的问题。谢谢,这真的很有帮助。特别是角色扮演的场景。也衷心祝贺你让你的第一篇SO帖子真正有责任感,而不仅仅是一句两句话的请求含糊不清的帮助。