在我們的數據庫中,我們有多個具有日期字段的實體。 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