NHibernate - 将ID映射到DB2标识

时间:2009-02-11 22:14:30

标签: nhibernate nhibernate-mapping db2 ibm-midrange

我对NHibernate很新,并试图通过ISeries提供程序连接到DB2表。该表有一个BIGINT主键,它作为标识自动生成。我已经在我的映射文件中尝试了id的generator属性的几个值,并且没有取得任何成功。表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”,根据documentation,选择DB2的“identity”。使用“native”或“identity”,我得到“列PKID中不允许空值”,以及当我将生成器类更改为其他各种值时的各种其他错误。

我确信文档中缺少一些小东西,但有没有办法让NHibernate获取DB2中生成IDENTITY的主键的下一个值并为我处理它当我调用Save()?我是否需要在NHibernate可以用来获取下一个值的地方写一个选择?

提前致谢。

1 个答案:

答案 0 :(得分: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属性,我只是用正确的属性重新创建表,将生成器类更改为“identity, “删除了SchemaExport调用,现在一切正常。