@Temporal(TemporalType.DATE) with Oracle 12



在我们的数据库中,我们有多个具有Date字段的实体。Oracle将每个日期视为相同的,具有日期和时间部分。然而,JPA实体通过注释@Temporal来区分。当我们想省略时间部分时,我们用@Temporal(TemporalType.DATE)注释Date字段,Oracle保存00:00:00,如果没有,我们就不注释。

的例子:

@Entity
public class MyEntity implements Serializable {
  private static final long serialVersionUID = 1L;
  @Id
  private long myentityId;
  @Temporal(TemporalType.DATE)
  private Date importantDate; //01.01.2015 00:00:00
  private Date creationDate; //01.01.2015 10:35:51
  ...
}
...
MyEntity me = new MyEntity();
me.setImportantDate(new Date());
me.setCreationDate(new Date());
...

我们从Oracle 11升级到Oracle 12,现在importantDate的时间部分不再被省略了!

我在两个数据库上用完全相同的程序进行了广泛的测试。这实际上破坏了我们的应用程序。

我怎么做才能恢复以前的行为?


更新1:我缩小了问题范围:驱动程序ojdbc6 12.1.0.1.0有问题,ojdbc6 11.2.0.3.0按预期工作。(都使用Oracle 12db)

这是11.1中修复的时间戳问题的延续吗?(http://www.oracle.com/technetwork/database/enterprise - edition/jdbc -常见问题- 090281. - html # 08 _01)


更新2:由于Hibernate似乎不是问题所在,所以我用纯JDBC编写了一个示例:

OracleDataSource ods = new OracleDataSource();
...
Connection conn = ods.getConnection();
PreparedStatement ps = conn.prepareStatement("UPDATE MyEntity SET importantDate = ? WHERE myentityId = 4385");
ps.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
ps.execute();
...

在ojdbc6 11.1和ojdbc6 12.1之间切换时,此代码段的行为不同。

我们已经联系了Oracle支持,他们回复如下(不幸的是,我无法提供链接到答案,因为需要Oracle支持帐户):

新行为按预期工作:

在JDBC 12.1.0.1中,getDate和setDate不会截断日期的时间部分。这种行为与JDBC 11.2.0不同。X,其中时间分量被截断。根据bug 14389749, 17228297,这个改变是故意的,12c驱动程序的行为是正确的。

变通方法为我提供了工作:

方法# 1:修改应用程序以不插入时间组件(例如,使用静态UtilMethod)

public static Date truncateTime(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); }

方法# 2:从MOS下载并应用补丁19297927:(My Oracle Support)

  1. 点击补丁&更新选项卡。
  2. 输入上述补丁号,点击搜索。
  3. 从列表中单击与您的平台对应的补丁号
  4. 点击下载按钮下载补丁。
  5. 下载前阅读所有适用的说明,然后点击下载按钮。

修复后替换%Oracle_Home%oracle_commonmodulesoracle.jdbc_12.1.0中的ojdb7.jar,并将-Doracle.jdbc.DateZeroTime=true添加到JVM参数

相关内容

  • 没有找到相关文章

最新更新