有人可以解释为什么在此示例中“lastAccessed”日期没有保存到数据库中,以及如何将其保存到数据库中?我的理解是 do 对象是 save() 调用之后的附加对象,因此所有修改都应该自动保留。
注意:“myDate”已正确保留,因此所有其他 spring 配置似乎都是正确的。
@Transactional(readOnly = false)
public DateObject getOrCreateDateObject(Date myDate) {
DateObject do = null;
do = getCurrentDateObject(); // For my tests, this has been returning null
if (do == null) {
// create a new object
do = new DateObject();
do.setDate(myDate);
sessionFactory.getCurrentSession().save(do);
}
// This does not persist to the database
do.setLastAccessed(new Date());
return do;
}
在 save() 调用之后,我还尝试了以下一些组合(以及更多组合)。这些都不起作用:
sessionFactory.getCurrentSession().merge(do); // tried before and after do.setDate(d2)
sessionFactory.getCurrentSession().update(do);
sessionFactory.getCurrentSession().saveOrUpdate(do);
sessionFactory.getCurrentSession().flush();
DateObject doCopy = (DateObject)sessionFactory.getCurrentSession().load(DateObject.class, do.getId());
sessionFactory.getCurrentSession().merge(doCopy);
doCopy.setLastAccessed(new Date());
我希望这是一个我没有看到的简单答案。感谢您的帮助!
编辑 #1 05/22/2012
根据要求,这里是该实体的映射,在 src/main/resources/META-INF/dateobject.hbm.xml 中指定。我可以看到列是在 mysql 客户端中使用“SELECT * FROM dateObjects”在数据库中创建的。MY_DATE 已正确填充,但 LAST_ACCESSED 设置为 NULL。
<class name="com.example.entity.DateObject" table="dateObjects">
<id name="id" column="DATE_OBJECT_ID">
<generator class="identity" />
</id>
<property name="date" type="date" column="MY_DATE" />
<property name="lastAccessed" type="date" column="LAST_ACCESSED" />
</class>
编辑 #2 2012 年 5 月 24 日
我在https://github.com/eschmidt/dateobject有一个有效的 SSCCE 。有趣的是,web 客户端(调用 localhost:8080/view/test)显示 lastAccessed 设置正确,但是当我使用 MySQL 客户端检查数据库时,它显示 lastAccessed 为 NULL。有了这套完整的代码,任何人都可以看到为什么即使方法标记为@Transactional,数据库也不会更新?