当前位置: 首页 > 面试题库 >

使用Oracle 12的@Temporal(TemporalType.DATE)

易研
2023-03-14
问题内容

在我们的数据库中,我们有多个带有日期字段的实体。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());
...

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

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

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

更新1:我缩小了范围:驱动程序ojdbc6 12.1.0.1.0出现了问题,ojdbc6 11.2.0.3.0可以正常工作。(都使用Oracle 12
DB)

这是11.1中解决的时间戳问题的延续吗?(http://www.oracle.com/technetwork/database/enterprise-
edition/jdbc-
faq-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不同。根据错误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. 在下载之前,请阅读所有适用的说明,然后单击“下载”按钮。

After patching replace ojdb7.jar in
%Oracle_Home%\oracle_common\modules\oracle.jdbc_12.1.0 and add
-Doracle.jdbc.DateZeroTime=true to your JVM Arguments



 类似资料:
  • Temporal Reprojection 是用于Unity 5.0+的反锯齿,在Playdead内部使用的抗锯齿解决方案的源代码发布。 要求 Unity 5.0+ 命令 复制Assets/* 到你的项目中 在 'Project Settings/Quality'下禁用MSAA 添加 TemporalReprojection 组件到你的相机中 添加 VelocityBufferTag 组件到个人移

  • 问题内容: Hibernate文档具有以下有关注释的信息: 在纯Java API中,未定义时间的时间精度。处理时态数据时,您可能需要描述数据库中的预期精度。时间数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者兼有)。使用@Temporal批注进行微调。 什么意思 什么是数据及其精度?如何调整? 问题答案: 必须为类型为和的持久字段或属性指定此注释。只能为这些类型的字

  • Hibernate文档包含以下注释的信息: 在普通的JavaAPI中,时间的时间精度没有定义。在处理时态数据时,可能需要描述数据库中的预期精度。时态数据可以具有日期、时间或时间戳精度(即实际日期、仅时间或两者)。使用@Temporal注释对其进行微调。 是什么意思?什么是数据及其精度?它如何微调?

  • 问题内容: 我使用Hibernate并尝试执行以下操作: 但是有这个例外: 如建议我尝试使用 但有相同的例外。我是否应该执行一些其他步骤或如何解决这种情况? 问题答案: 如果您希望日期和时间一起使用,则不能与Java 8时间一起使用,如果您只希望不带注释的日期一起使用,则不能与Java 8时间一起使用。 还要看http://www.thoughts-on-java.org/persist-loca

  • 问题内容: 如果我们使用 代替 如果我们使用不带注释的日期列属性,会有任何副作用吗? 问题答案: 我设法找到的只有一部分文档: 在纯Java API中, 未定义时间 的 时间精度 。处理时态数据时,您可能需要描述数据库中的预期精度。时间数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者兼有)。使用@Temporal批注进行微调。 从2.2.2.1开始。声明基本属性映射

  • 我计划将 Cadence 或临时工作流用于架构,但我们计划在决定工作流时为用户提供很大的权力。在他们的用例中,节奏和时间都提到他们的SDK支持自定义DSL,但我看不到该功能。你能帮帮我吗?