1

我对 NHibernate 很陌生,并且正在尝试通过 ISeries 提供程序连接到 DB2 表。该表有一个作为身份自动生成的 BIGINT 主键。我在映射文件中为 id 的生成器属性尝试了几个值,但都没有成功。表 def 如下所示(字段名称已更改):

CREATE TABLE SCHEMA/TABLE (
    PKID BIGINT GENERATED ALWAYS AS IDENTITY (
        START WITH 1 INCREMENT BY 1
        NO MINVALUE NO MAXVALUE
        NO CYCLE NO ORDER
        CACHE 20)
    ,
    SOMESTRING VARCHAR(50) CCSID 37 DEFAULT NULL,
    FIRSTFK BIGINT NOT NULL,
    SECONDFK BIGINT DEFAULT NULL,
    ANOTHERSTRING VARCHAR(100) CCSID 37 DEFAULT NULL,
    CONSTRAINT NISDEV/PK_TABLE PRIMARY KEY (PKID));

映射文件如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Project.Domain.Thing, Project" table="TABLE">
    <id name="ID" column="PKID" type="Int64">
      <generator class="**???????**" />
    </id>
    <property name="SomeString" column="SOMESTRING" />
    <property name="FirstFK" column="FIRSTFK"/>
    <property name="SecondFK" column="SECONDFK"/>
    <property name="AnotherString" column="ANOTHERSTRING"/>
  </class>
</hibernate-mapping> 

起初,我将生成器类设置为“native”,根据文档,它为 DB2 选择“identity”。使用“本机”或“身份”,当我将生成器类更改为各种其他值时,我得到“PKID 列中不允许空值”以及各种其他错误。

我确定文档中缺少一些小东西,但是有什么方法可以让 NHibernate 获取主键的下一个值,它是 DB2 中的 GENERATED IDENTITY 并在我调用时为我处理它节省()?我是否需要在 NHibernate 可以用来获取下一个值的地方写一个选择?

提前致谢。

4

1 回答 1

1

我想通了,所以如果将来有人在做这种事情并遇到同样的问题,那就是它。

我正在使用NHibernate FAQ中的教程并将其改编为 ISeries。跟随它到 T,我忽略了跳过实际创建模式的部分。我已经在 ISeries DB2 环境中创建了所有表,所以我不应该为我的测试运行这样做:

<NUnit.Framework.SetUp()> _
Public Sub SetupContext()
     Dim schemaExport As New NHibernate.Tool.hbm2ddl.SchemaExport(_configuration)
     schemaExport.Execute(False, True, False, False)
End Sub

特别是因为我为 ID 字段设置了错误的映射文件,生成器类为“已分配”。一旦我查看了我的表定义并意识到 NHibernate 在调用 SchemaExport.Execute() 时覆盖了主键字段 PKID 的 GENERATED IDENTITY 属性,我只需使用正确的属性重新创建表,将生成器类更改为“身份, " 删除了 SchemaExport 调用,现在一切正常。

于 2009-02-12T16:09:32.970 回答