使用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, ...
导致以下异常:
内部例外: com.microsoft.sqlserver.jdbc.SQLServerException:Ein expliziterWertfürdieIdentitätsspaltekannin der tContacts-Tabellenichtingefügtwerden,wenn IDENTITY_INSERT auf OFF festgelegt ist。
错误代码:544
(对不起,这是德语,但它告诉我们只要IDENTITY_INSERT设置为OFF,就可以将任何值插入到标识列中,这是默认值)
我假设SQLServer想要自己创建ID,所以不喜欢EclipseLink尝试在id列中插入一个值(此处为:null)。
所有其他策略,或者完全省略生成值策略,都会产生相同的结果
到目前为止,我发现无法让EclipseLink将记录插入此表中!
将IDENTITY INSERT设置为ON是不可行的解决方案,因为标准用户无权修改表格。
在Hibernate中映射这个表是很简单的,所以我很惊讶EclipseLink似乎是不可能的。我在Hibernate中是如何做到的:
<id name="id" type="int">
<column name="conIdContact" />
<generator class="assigned" />
</id>
我被困住了,我感谢任何想法,这里出了什么问题! 汉纳斯
@Chris:我坚持这样: