滚动日历不会按预期持久化

时间:2013-04-29 11:38:40

标签: java hibernate spring-mvc calendar

我正在尝试将日历滚动一周,并使用Hibernate将其保留。滚动工作(使用 println 测试),但保存在数据库中的数据似乎是原始日历。

    Calendar outDate = Calendar.getInstance();
    System.out.println(outDate.getTime());
    Loan loan = new Loan();
    loan.setCatalogueEntry(catalogueEntry);
    loan.setOutDate(outDate);
    loan.setNoOfRenewals(0);
    outDate.add(Calendar.WEEK_OF_YEAR, 1);  //Rolling the calendar to a week further
    System.out.println(outDate.getTime());
    loan.setDueDate(outDate);
    loan.setUser(user); 

    loanDao.save(loan);
    catalogueEntryDao.update(catalogueEntry);

GenericHibernateDao<T, ID extends Serializable> implements GenericDao<T, ID>类有以下方法:

@Override
public void save(T instance) {
    getSessionFactory().getCurrentSession().save(instance);
}

public interface LoanDao extends GenericDao<Loan, Long>没有任何save方法的实现。

我的代码有什么问题?

2 个答案:

答案 0 :(得分:1)

您在dueDate和outDate中设置了相同的Calendar实例!设置outDate时,日历就是例如在2012-07-02,然后您将日历值更新为2012-07-09,并将其存储在dueDate中。

问题是,同一个日历实例也用于outDate,所以当Hibernate持久保存你的对象时,它会完全正确地存储它,因为两个属性共享同一个Calendar对象。

在更新日历之前克隆日历,您的问题就解决了。

AND:存储在数据库中的日期都是dueDate日历的时间,而不是您发布的原始日历!

答案 1 :(得分:0)

roll不会更改较大的字段(see JavaDoc

使用

outDate.add(Calendar.WEEK_OF_YEAR, 1);

代替