保存后,Hibernate不会保留数据

时间:2012-05-23 02:22:12

标签: spring hibernate save flush persist

有人可以解释为什么在此示例中“lastAccessed”日期没有保存到数据库中,以及如何将其保存到数据库中?我的理解是do对象是save()调用之后的附加对象,因此所有修改都应该自动保留。

注意:“myDate”正确保留,因此所有其他弹簧配置似乎都是正确的。

@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 05/24/2012

我在https://github.com/eschmidt/dateobject有一个工作的SSCCE。有趣的是,Web客户端(调用localhost:8080 / view / test)显示lastAccessed设置正确,但是当我使用MySQL客户端检查数据库时,它显示lastAccessed为NULL。有了这整套代码,任何人都可以看到为什么数据库不会更新,即使该方法被标记为@Transactional?

2 个答案:

答案 0 :(得分:1)

如果您完全确定在运行该代码后,do.date存储在数据库中而do.lastAccessed不存在,那么您的连接和事务显然已正确设置。我的第一个猜测是不正确的映射,因为这是最简单的解决方案。您在@Transient的字段,获取者或设置者上碰巧没有lastAccessed,对吗? (当然,假设您正在使用注释来映射域对象。)

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

更新:很难将完整的应用程序修剪到可能出现问题的最小代码。结果是你可能会在你找到答案时找到答案。如果您只是需要在正确的方向上进行一些微调,我有很多sample projects in github可能会对您有所帮助。 basic-springmvc可能与您正在进行的操作最接近,但它使用注释而不是xml进行映射。它也是一个Spring MVC项目。在主类中手动启动Spring上下文要比担心整个servlet容器和Spring MVC希望你拥有的多个上下文要简单得多。例如,spring-method-caching就是这样做的一个例子。

至于您发布的映射,它看起来很好,尽管自从我触及XML映射以来已经有很长一段时间了。您使用的是现场或财产访问吗?这可能与事情有关。另外,SessionFactory中是否有可能与您的对象混淆的自定义listenersinterceptors

答案 1 :(得分:0)

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