Eri*_*ric 6 spring hibernate flush save 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;
}
Run Code Online (Sandbox Code Playgroud)
在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());
Run Code Online (Sandbox Code Playgroud)
我希望这是一个简单的答案,我只是没有看到.谢谢您的帮助!
编辑#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>
Run Code Online (Sandbox Code Playgroud)
编辑#2 05/24/2012
我在https://github.com/eschmidt/dateobject上有一个工作SSCCE .有趣的是,Web客户端(调用localhost:8080/view/test)显示lastAccessed设置正确,但是当我使用MySQL客户端检查数据库时,它显示lastAccessed为NULL.有了这整套代码,任何人都可以看到为什么数据库不会更新,即使该方法被标记为@Transactional?
如果您绝对确定运行该代码后,do.date存储在数据库中而do.lastAccessed不是存储在数据库中,那么您的连接和事务显然已正确设置。我的第一个猜测是映射不正确,因为这是最简单的解决方案。你在场上碰巧没有@Transient,二传手,二传手lastAccessed,是吗?(当然,假设您正在使用注释来映射域对象。)
如果您可以提供SSCCE,我敢打赌我或其他人可以给您一个明确的答案。
更新:很难将完整的应用程序缩减为能够演示问题的最小代码。结果是,当你这样做时,你很可能会找到答案。我在 github 上有很多示例项目,如果您只需要在正确的方向上进行一些推动,它们可能会帮助指导您。basic-springmvc可能最接近您正在做的事情,但它使用注释而不是 xml 进行映射。这也是一个 Spring MVC 项目。在主类中手动启动 Spring 上下文比担心整个 servlet 容器和 Spring MVC 希望您拥有的多个上下文要简单得多。例如,spring-method-caching有一个这样做的例子。
至于您发布的映射,看起来不错,尽管我已经很长时间没有接触过 XML 映射了。您使用的是字段访问还是属性访问?这可能会对事情产生影响。另外, SessionFactory 中是否有任何自定义侦听器或拦截器可能会影响您的对象?
| 归档时间: |
|
| 查看次数: |
7514 次 |
| 最近记录: |