【问题标题】:Rolled Calendar isn't persisting as desired滚动日历未按预期保留
【发布时间】:2013-04-29 11:38:39
【问题描述】:

我正在尝试将日历滚动一周并使用 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> 没有任何保存方法的实现。

我的代码有什么问题?

【问题讨论】:

  • 你能发布你的 println() 吗?
  • 发布你的 LoadDao 和你的 hibernate.xml
  • @Daniel:请检查更新。此外,我的 sessionfactory 是通过 spring bean 实例化的,而不是 hibernate.cfg.xml 文件。

标签: java hibernate spring-mvc calendar


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,我想通了,只是找不到时间来回答它。既然你已经详细回答了这个问题,省去了我的麻烦,我就接受了你的回答。不过,感谢您的宝贵时间。
【解决方案2】:

滚动不会更改更大的字段 (see JavaDoc)

使用

outDate.add(Calendar.WEEK_OF_YEAR, 1);

改为

【讨论】:

  • 有用的补充,但可能与实际问题无关。较大的字段未被修改仅意味着如果滚动操作意味着超过最大值,则滚动字段将返回到其最小值。例如。如果日历设置为 4 月 30 日并且您将 DAY_OF_MONTH 字段滚动 1,则结果将是 4 月 1 日。将 DAY_OF_MONTH 加一将导致 5 月 1 日。
  • 2013 年 4 月 29 日星期一 22:50:48 EST 2013 年 5 月 6 日星期一 22:50:48 EST 2013 这些是输出。它们的值在持久化之前显示。
  • 您可以在调用 setter 时尝试调试。也许它被调用了,你不希望它
  • @PhilippSander 我没听懂你
  • 在 DueDate-Setter 中放一个 println。现在您可以看到它被调用的频率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2017-07-19
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多