1

使用 EclipseLink,我试图将行插入到具有自动递增标识列的 SQLServer 遗留数据库中:

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, ...

导致以下异常:

Internal Exception: 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,就不能将值插入标识列,这是默认值)

我假设 SQLServer 想要创建 ID 本身,所以不喜欢 EclipseLink 尝试将一个值(这里:null)插入到 id 列中。
所有其他策略,或者完全忽略生成值策略,都会产生相同的结果。
到目前为止,我还没有找到让 EclipseLink 将记录插入此表的方法!

将 IDENTITY INSERT 设置为 ON 不是可行的解决方案,因为标准用户不应该拥有修改表的权限。

在 Hibernate 中映射这个表很简单,所以我很惊讶使用 EclipseLink 似乎是不可能的。这是我在 Hibernate 中的操作方式:

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

我被卡住了,我很欣赏这里出了什么问题的任何想法!
汉内斯

@Chris:我坚持这样:
con.setName("testheini_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