2012-12-24 37 views
4

我正在使用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> 

有沒有人見過這個問題,或者看我可能犯任何錯誤?

謝謝!

回答

1

我能夠弄清楚這一點,它實際上是由於我的一個遺漏。 我需要將ojdbc6.jar文件添加到glassfish的域\ domain1 \ lib \ ext \目錄中,以便EclipseLink可以找到oracle.sql.timestamptz類型。

就是這樣。這樣做之後,我能夠檢索和存儲時區數據使用Oracle數據庫:

@Column(name = "START_DATE_TIME") 
@Temporal(TemporalType.TIMESTAMP) 
private Calendar startDateTime; 

無需使用@TypeConverter或@Converter的EclipseLink自動將其轉換在這個版本。 您還需要使用日曆,而不是日期,以便您可以檢索時區信息。

我將這件事留給任何可能遇到此事的人。

0

你需要指定一個轉換器

@Convert("timestamptz") 
@TypeConverter(name="timestamptz", dataType=TIMESTAMPTZ.class) 
@Column(name = "START_DATE_TIME") 
@Temporal(TemporalType.TIMESTAMP) 
private Date startDateTime; 

您還需要配置服務器平臺,這樣的EclipseLink可以得到JDBC連接正確地做轉換。這可以在persistence.xml中完成

<property name="eclipselink.target-server" value="WebLogic"/> 
+0

嗨,我試過這個,但仍然得到相同的錯誤。實際上,使用新的轉換器註釋,當我堅持數據庫時也會拋出錯誤,而沒有轉換器註釋,我可以用時區保存到數據庫,而不是從中檢索數據。我也使用Glassfish 3.1.2.2。我嘗試從EclipseLink 2.3.2更新到2.3.3,但仍然沒有運氣。感謝您嘗試幫助。 –

+0

你能發佈你得到的錯誤嗎? –

+0

當然。使用註釋保存時的錯誤是: 異常[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。 –

1

嘗試過大部分在這裏提到的解決方案後:

  1. 添加ojdbc6.jar到classpath中。
  2. 有和沒有@TypeConverter和@Converter。
  3. 將實體屬性更改爲java.util.Date和java.util.Calendar。
  4. 將eclipselink.target-server設置爲weblogic。

...以下錯誤依然存在:

例外[的EclipseLink-3002](Eclipse持久服務 - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.ConversionException例外 描述:對象[[email protected]],類 [類oracle.sql.TIMESTAMPTZ]的,從映射 [org.eclipse.persistence.mappings.DirectToFieldMapping [...]] 與描述符 [RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent - > [DatabaseTable(APPT_EVENT)])],無法轉換爲[java.util.Date類]。

當我將eclipselink.target數據庫從「Oracle」更改爲「Oracle11」時,終於找到了它(沒有@converter和java.util.Calendar在我的實體中)。