我正在使用JPA和GlassFish 3.1.2.2和EclipseLink 2.3.2編寫應用程序。我正在使用Oracle DB 11g,並嘗試使用TIMESTAMPTZ字段類型與時區一起存儲日期和時間。EclipseLink和Oracle DB的TimeZone錯誤
使用我的設置,我可以將日期和時間與時區一起保存到數據庫中。 (更新 - 實際上,在查看實際的SQL調用時,它只會傳遞日期和時間,Oracle保存到數據庫時必須添加時區。
然而檢索數據回來的時候,我得到以下異常:
例外[的EclipseLink-3002](Eclipse持久服務 - 2.3.2.v20111125-r10461):org.eclipse.persistence。 exceptions.ConversionException 異常說明:映射[org.eclipse.persistence.mappings.DirectToFieldMapping [startDateTime - > APPT_EVENT.START_DATE_TIME]類[class oracle.sql.TIMESTAMPTZ]中的對象[[email protected]] ]]與描述符[RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent - > [DatabaseTable(APPT_EVENT)])]無法轉換爲[java.util.Date]類。
有沒有人曾經遇到過這個?這是我在我的實體類「的startDateTime」字段的設置方式:
@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
START_DATE_TIME在DB定義與以下DDL:
"START_DATE_TIME" TIMESTAMP (6) WITH TIME ZONE
我對EclipseLink的維基here閱讀EclipseLink本身支持oracle的TIMESTAMPTZ,而無需進行任何轉換。我也嘗試在實體類中使用「日曆」類型而不是「日期」類型。
更新: 也試過這個
@Convert("timestamptz")
@TypeConverter(name="timestamptz", dataType=TIMESTAMPTZ.class)
@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
沒有運氣依然。奇怪的是,隨着轉換器的加入,堅持數據庫不再有效。嘗試保存值時出現此錯誤。
異常[的EclipseLink-3002](Eclipse持久服務 - 2.3.3.v20120629-r11760):org.eclipse.persistence.exceptions.ConversionException 異常描述:對象[12年12月4日7時AM],類[java.util.Date],映射[org.eclipse.persistence.mappings.DirectToFieldMapping [startDateTime - > APPT_EVENT.START_DATE_TIME]]與描述符[RelationalDescriptor(com.ntst.caremanager.server.entities .ApptEvent - > [DatabaseTable(APPT_EVENT)])]無法轉換爲[class oracle.sql.TIMESTAMPTZ]。
嘗試檢索值時仍出現同樣的錯誤。 我也嘗試將Glassfish更新到EclipseLink 2.3.3並得到相同的錯誤。
這是我的持久性文件:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="CM-warPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>CMDEV</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.target-server" value="SunAS9"/>
</properties>
有沒有人見過這個問題,或者看我可能犯任何錯誤?
謝謝!
嗨,我試過這個,但仍然得到相同的錯誤。實際上,使用新的轉換器註釋,當我堅持數據庫時也會拋出錯誤,而沒有轉換器註釋,我可以用時區保存到數據庫,而不是從中檢索數據。我也使用Glassfish 3.1.2.2。我嘗試從EclipseLink 2.3.2更新到2.3.3,但仍然沒有運氣。感謝您嘗試幫助。 –
你能發佈你得到的錯誤嗎? –
當然。使用註釋保存時的錯誤是: 異常[EclipseLink-3002](Eclipse持久性服務 - 2.3.3。v20120629-r11760):org.eclipse.persistence.exceptions.ConversionException 異常說明:來自映射[org.eclipse的類[java.util.Date]類的對象[12/4/12 7:00 AM]。描述符[RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent - > [DatabaseTable(APPT_EVENT)])]的persistence.mappings.DirectToFieldMapping [startDateTime - > APPT_EVENT.START_DATE_TIME]]無法轉換爲[class oracle.sql.TIMESTAMPTZ。 –