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 に
追加しました。しかし、それは何の違いもありません。他に何を確認できますか?
ハンネス