【发布时间】:2016-01-18 20:28:54
【问题描述】:
在我们的数据库中,我们有多个带有日期字段的实体。 Oracle 将每个日期视为相同的日期和时间部分。然而,JPA 实体通过注释 @Temporal 进行区分。当我们想省略时间部分时,我们用@Temporal(TemporalType.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 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 之间切换时,此 sn-p 的行为有所不同。
【问题讨论】:
-
您是否也更新了应用程序中的 Oracle 驱动程序?
-
您使用的是哪个版本的 Hibernate?你在用
Oracle12cDialect吗? -
我们仍然使用 org.hibernate.dialect.Oracle10gDialect 和 OJDBC7 驱动。现在将尝试新的方言。
-
确实有人想知道为什么 Hibernate 不能自动检测正在使用的 RDBMS 并选择正确的“方言”。毕竟,其他 JPA 提供者可以做到这一点
-
@Thomas6767:我们尝试安装一些 Oracle WL 补丁。也没有用。这里解释了一个解决方法:stackoverflow.com/questions/10429276/…。虽然这不是一个非常令人满意的解决方案。您是否考虑过 Oracle 服务请求?
标签: java oracle hibernate jpa oracle12c