- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我们的数据库中,我们有多个带有日期字段的实体。 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 12 数据库)
这是 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 支持帐户):
新行为按预期工作:
In JDBC 12.1.0.1, getDate and setDate do not truncate the time component of the date. This behavior is different to JDBC 11.2.0.X, where the time component is truncated. As per bug 14389749, 17228297 this change is deliberate and the 12c driver's behavior is correct.
解决方法为我提供了工作:
解决方法 #1:修改应用程序以不插入时间组件(例如使用静态 UtilMethod)
public static Date truncateTime(Date date) {
日历 calendar = Calendar.getInstance();
日历.setTime(日期);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
返回 calendar.getTime();
}
解决方法 #2:从 MOS 下载并应用补丁 19297927:(My Oracle Support)
修补后替换 %Oracle_Home%\oracle_common\modules\oracle.jdbc_12.1.0
中的 ojdb7.jar 并将 -Doracle.jdbc.DateZeroTime=true
添加到您的 JVM参数
关于java - @Temporal(TemporalType.DATE) 与 Oracle 12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232260/
为什么 YearMonth 类是 Temporal(接口(interface))而 MonthDay 不是 Temporal? 这看起来很奇怪,因为这两个类的含义几乎相同。 我可能会建议永远不要在使用
如何将 java.time.temporal.Temporal 实例转换为 java.util.Date 实例? java.time.temporal.Temporal someTemporal =
在查看 java 8 Time API 时,我看到很多方法都期望作为参数 ChronoUnit (TemporalUnit 的实现)为 here而其他人则期望 ChronoField (Tempora
我使用@Temporal注释创建了一个实体: import java.util.Date; @Entity public class TestEntity implements java.io.Ser
使用 Temporal.Calendar Temporal 即将提出的建议global 对象,以下短函数在日历日期(Javascript 识别的 18 个日历)之间进行转换。 目前,Temporal.
我得到了一些用户输入的日期时间格式字符串,并且需要检查我可以解析该格式数据的 java.time 时间(在合理范围内,我打算只支持更简单的目前的案例)。 与此表类似的内容: 输入格式预期答案年月日ja
我正在尝试创建一个以不规则间隔收集数据的通用模块。新数据到达后,数据立即从左端到达。这可能大约是每秒 100 次。 在右端,我希望能够“插入”n 个监听器,每个监听器都有自己的常规间隔。为了简单起见,
我在我的客户实体中使用下面的内容来映射日期字段 @Temporal(TemporalType.DATE) @Column(name = "birthdate") @DateTimeFormat(pat
mongoDB 有类似的东西吗? @Temporal(TemporalType.TIMESTAMP) @NotNull @Temporal(TemporalType.TIMESTAMP) @DateT
前言 本篇只会教 Angular Material Datepicker 里最关键的组件 -- Calendar 组件。 还有如何自定义 DateAdapter,让 Calendar 支持&nbs
我正在为 JavaScript 的 proposed new Temporal API 苦苦挣扎.我想做的应该是直截了当的,但我找不到令人信服的解决方案。我一定是遗漏了什么。 任务如下:根据年、月、日
无法使用 @Temporal 为 LocalDate 编译代码。 实体代码 ... @Temporal(TemporalType.DATE) private LocalDate creationDat
我有一个使用 Thymeleaf 作为 View 层的 Spring Boot Web 应用程序,我需要显示一些具有特定时区 (CET = UTC+1/UTC+2) 的日期。 服务器设置为 UTC,所
这是一个有点低级的问题。在 x86 汇编中,有两条 SSE 指令: MOVDQA xmmi, m128 和 MOVNTDQA xmmi, m128 IA-32 软件开发人员手册称 MOVNTDQA 中
我有一个使用 Thymeleaf 作为 View 层的 Spring Boot Web 应用程序,我需要显示一些具有特定时区 (CET = UTC+1/UTC+2) 的日期。 服务器设置为 UTC,所
您好,我想在我的 Java 类中映射一个字段 @Column(name = "date_of_birth") @Temporal(TemporalType.DATE) private Date dat
interface SomeDataClass { TemporalAccessor getSomeTime(); } //somewhere in the impl... public Temp
如果我们使用 @Column(name="birth_date", nullable=false, length=19) public Date getBirthDate() { return
Hibernate 文档包含以下关于 @Temporal 注释的信息: In plain Java APIs, the temporal precision of time is not define
我正在研究各种碰撞检测算法,其中之一是扫描和修剪。我想我对它的工作原理有很好的了解;您为每个轴存储一个排序的端点列表,并且在每次更新期间我必须保持列表排序。以下是我发现的帮助我理解此算法的网页之一的链
我是一名优秀的程序员,十分优秀!