1

EclipseLink を使用して、自動インクリメント ID 列を持つ SQLServer レガシー DB に行を挿入しようとしています。

CREATE TABLE [dbo].[tContacts] (
[conIdContact] [int] IDENTITY (1, 1) NOT NULL ,
[conContactName] [varchar] (100) NOT NULL , ...

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Example_identity_XMLで説明されているように、「アイデンティティ」戦略を使用しています

      <orm:id name="id">
        <generated-value strategy="IDENTITY"/>
        <orm:column name="conIdContact" updatable="false" />
  </orm:id>

EclipseLink は次の SQL を生成します。

Call: INSERT INTO tContacts (conIdContact, ConContactName, ...
VALUES (?, ?, ...
bind => [null, testheini_2, ...

次の例外が発生します:

内部例外: com.microsoft.sqlserver.jdbc.SQLServerException: Ein expliziter Wert für die Identitätsspalte kann in der tContacts-Tabelle nicht eingefügt werden, wenn IDENTITY_INSERT auf off festgelegt ist. エラーコード: 544

(これはドイツ語で申し訳ありませんが、IDENTITY_INSERT がデフォルトである OFF に設定されている限り、ID 列に値を挿入できないことを示しています)

SQLServer は ID 自体を作成したいので、EclipseLink が id 列に値 (ここでは null) を挿入しようとするのは好きではないと思います。
他のすべての戦略、または生成された値の戦略をすべて一緒に省略しても、同じ結果が得られます。
これまでのところ、EclipseLink でこのテーブルにレコードを挿入する方法は見つかりませんでした。

標準ユーザーにはテーブルを変更する権限がないため、IDENTITY INSERT を ON に設定することは現実的な解決策ではありません。

Hibernate でこのテーブルをマッピングするのは簡単だったので、EclipseLink では不可能に思えることに非常に驚いています。ここで、Hibernate でどのように実行したかを示します。

        <id name="id" type="int">
        <column name="conIdContact" />
        <generator class="assigned" />
    </id>

私は立ち往生しており、ここで何がうまくいかないのかについてのアイデアに感謝します!
ハンネス

@クリス:私はそのように固執します:
con.setName( "testtheini_2");
em.getTransaction().begin();
em.persist(con);
em.getTransaction().commit();

contact-orm.xml ファイルが実際に使用されており、タイプミスを追加するとすぐに確認できます。 また、 property name="eclipselink.target-database" value="SQLServer" または property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.SQLServerPlatform" を persistence.xml に
追加しました。しかし、それは何の違いもありません。他に何を確認できますか? ハンネス





4

0 に答える 0