在我们的数据库中,我们有多个具有日期字段的实体。 Oracle将每个日期看作相同的日期和时间部分。然而,JPA实体通过annotaton @Temporal区分。当我们想省略时间部分时,我们使用@Temporal(TemporalType.DATE)和Oracle对日期字段进行注释,如果没有,则保存00:00:00,我们只是不加注释。@Temporal(TemporalType.DATE)与Oracle 12
例子:
@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: 由于休眠似乎并不成为问题,我写用纯JDBC一个例子:ojdbc6 11.1和ojdbc6之间切换时
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();
...
该片段表现不同12.1。
之后你有没有在你的应用程序更新Oracle驱动程序呢? –
您使用的是哪个版本的Hibernate?你在使用['Oracle12cDialect'](https://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/dialect/Oracle12cDialect.html)吗? – Tunaki
我们仍然使用org.hibernate.dialect.Oracle10gDialect和OJDBC7驱动程序。现在尝试新的方言。 – Thomas