我正在尝试按一周滚动一个日历,并使用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>
没有任何保存方法的实现。
我的代码有什么问题?
您在dueDate和outDate中设置了相同的日历实例!当你设置了outDate,日历是例如2012-07-02,然后你更新日历值为2012-07-09,并将其存储在dueDate中。
问题是,outDate也使用了相同的日历实例,所以当Hibernate持久化您的对象时,它会完全正确地存储它,因为两个属性共享相同的calendar对象。
在更新之前先克隆日历,你的问题就解决了。
AND:数据库中存储的日期是dueDate日历的两倍,而不是您发布的原始日历!
roll不能改变较大的字段(参见JavaDoc)
使用outDate.add(Calendar.WEEK_OF_YEAR, 1);
相反,