5

GlassFish 3.1.2.2およびEclipseLink 2.3.2でJPAを使用するアプリケーションを作成しています。Oracle DB 11g を使用しており、TIMESTAMPTZ フィールド タイプを使用してタイムゾーンで日付と時刻を保存しようとしています。

私の設定では、日付と時刻をタイムゾーンとともにデータベースに永続化できます。(更新-実際に実際のSQL呼び出しを見ると、日付と時刻のみが渡されます。OracleはDBに保存するときにタイムゾーンを追加する必要があります)。

ただし、データを取得すると、次の例外が発生します。

例外 [EclipseLink-3002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ConversionException 例外の説明: クラス [class oracle. sql.TIMESTAMPTZ]、マッピング [org.eclipse.persistence.mappings.DirectToFieldMapping[startDateTime-->APPT_EVENT.START_DATE_TIME]] から記述子 [RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent] --> [DatabaseTable(APPT_EVENT) )])]、[class java.util.Date] に変換できませんでした。

誰もこれに遭遇したことがありますか?これは、エンティティ クラスの「startDateTime」フィールドの設定方法です。

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

START_DATE_TIME は、次の DDL を使用して DB で定義されます。

"START_DATE_TIME" TIMESTAMP (6) WITH TIME ZONE

eclipselink wiki 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 Persistence Services - 2.3.3.v20120629-r11760): org.eclipse.persistence.exceptions.ConversionException 例外の説明: クラス [クラスのオブジェクト [12/4/12 7:00 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>

誰かが以前にこの問題を見たことがありますか、または私が犯した可能性のあるエラーを見ましたか?

ありがとうございました!

4

3 に答える 3

1

コンバーターを指定する必要があります

@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"/>
于 2012-12-25T00:41:36.670 に答える
1

私はこれを理解することができました、そしてそれは実際には私の側の怠慢によるものでした. ojdbc6.jar ファイルを Glassfish の domain\domain1\lib\ext\ ディレクトリに追加して、EclipseLink が oracle.sql.timestamptz タイプを検出できるようにする必要がありました。

それでおしまい。それを行った後、次を使用して、タイムゾーンデータを取得してOracleデータベースに保存できます。

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

このバージョンでは、EclipseLinkが自動的に変換するため、 @TypeConverter または @Converter を使用する必要はありません。また、TimeZone 情報を取得できるように、Date ではなく Calendar を使用する必要があります。

これに遭遇する可能性のある他の人のために、これを残します。

于 2013-01-03T00:14:14.473 に答える