6

有人可以解释为什么在此示例中“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,数据库也不会更新?

4

2 回答 2

2

如果您绝对确定在运行该代码后do.date存储在数据库中而do.lastAccessed不是存储在数据库中,那么您的连接和事务显然设置正确。我的第一个猜测是不正确的映射,因为这是最简单的解决方案。你不会碰巧有一个@Transienton the field、getter 或 setter lastAccessed,对吗?(当然,假设您使用注释来映射您的域对象。)

如果您可以提供SSCCE,我敢打赌我或其他人可以给您一个明确的答案。

更新:很难将一个完整的应用程序缩减为展示问题的最小代码。结果是,您很可能会找到答案。我在 github中有很多示例项目,如果您只需要朝着正确的方向轻推一些,它们可能会帮助您指导。basic-springmvc可能最接近您正在做的事情,但它使用注释而不是 xml 进行映射。它也是一个 Spring MVC 项目。在主类中手动启动 Spring 上下文比担心整个 servlet 容器和 Spring MVC 希望您拥有的多个上下文要简单得多。例如, spring-method-caching有一个这样做的例子。

至于您发布的映射,它看起来不错,尽管我已经很久没有接触 XML 映射了。您使用的是字段访问还是属性访问?这可能对事情有影响。此外, SessionFactory 中是否有任何自定义侦听器或拦截器可能与您的对象一起玩弄?

于 2012-05-23T02:51:36.843 回答
0

您将 IDENTITY 生成用于标识符生成策略,因此此处的 save() 调用立即转换为插入。您是否看到在那之后执行了任何 INSERT/UPDATE/DELETE SQL?如果不是,则很可能会话没有被刷新。冲洗可能发生在许多地方,如果您不熟悉,请阅读有关冲洗的文档。

于 2012-05-23T12:49:42.583 回答