2017-04-03 89 views
0

我有一个名为Period的类,它具有initialDateendDate以及TemporalType=DATE注释(日历属性)。我试图坚持它与JPA,但显然休眠是不是管理做正确。JPA持续错误日历日期

这些属性:

@Temporal(TemporalType.DATE) 
private Calendar dataInicial; // initialDate 
@Temporal(TemporalType.DATE) 
private Calendar dataFinal; // endDate 

我想这样设置:

Periodo periodo = new Periodo(); 
periodo.setDataInicial(Calendar.getInstance()); 
Calendar dataFinal = periodo.getDataInicial(); 
dataFinal.add(Calendar.MONTH, 6); 
periodo.setDataFinal(dataFinal); 
em.persist(periodo); 

当我SYSOUT所有值它工作完全正常,但在数据库中它是记录为:

+----+------------+-------------+ 
| id | dataFinal | dataInicial | 
+----+------------+-------------+ 
| 5 | 2017-10-03 | 2017-10-03 | 
+----+------------+-------------+ 

如果我设置Calendar dataFinal = Calendar.getInstance();它工作正常并持续为我想:

+----+------------+-------------+ 
| id | dataFinal | dataInicial | 
+----+------------+-------------+ 
| 6 | 2017-10-03 | 2017-04-03 | 
+----+------------+-------------+ 

为什么?我认为这更多的是Java/OOP问题,所以我会坚持使用它。

+0

'java.util.Calendar'是可变的。您已将相同的对象分配给两个字段,然后突变该对象。 –

+0

那么管理不同日期的最佳方法是什么?我有一个有用户输入的initialDate,但endDate总是6个月后。 –

+0

为什么你需要日历?为什么不使用日期? –

回答

0
Calendar.getInstance() 

这将返回日历

periodo.setDataInicial(Calendar.getInstance()); 

的情况下这种分配日历对象dataInicial当你说

Calendar dataFinal = periodo.getDataInicial(); 

这是由dataInicial reffed的日历对象分配给dataFinal。因此,在此之后,您为dataInicialdataFinal所做的更改都反映在这两个字段中。

OOP中没有缺陷