在 Nhibernate 中映射不存在的列

发布于 2024-10-20 13:04:30 字数 3410 浏览 2 评论 0原文

我正在使用 Oracle 旧数据库,并尝试映射与两个表的关系。不幸的是,设计数据库的公司使用了复合键。

我有这个表(ORDERS),它有一个由 3 个字段组成的主键:订单号(编号)、版本和公司。

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BpSalesOrders.Domain"
                   namespace="BpSalesOrders.Domain">
  <class name="Order" table="OCSAORH" mutable="false" where="OCHAMND = 0">
    <cache usage="read-only"/>
    <composite-id>
      <key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
      <key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
      <key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
    </composite-id>
    <property name="Reference" column="OCHOCNO" type="String" length="25"></property>
    <property name="Date" column="OCHOCDT" type="Int32"></property>
    <property name="Status" column="OCHSTA1" type="Char"></property>
    <property name="LineOfCreditStatus" column="OCHSTA4" type="Char"></property>
    <property name="WareHouse" column="OCHRESP" type="String"></property>
    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true" default="0"/>
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found ="ignore"/>
    </set>
    <set name="OrderReleases" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false">
      <key>
        <column name="ORLORDINE" not-null="true" />
        <column name="ORLSOCIETA" not-null="true"/>
      </key>
      <one-to-many class="OrderRelease" not-found ="ignore"/>
    </set>
  </class>
</hibernate-mapping>

与 OrderLines 存在关系,该关系工作正常,因为该表具有完全相同的键结构。 我的 OrderReleases 关系有问题。该表有一个由 OrderNumber、Company 和日期组成的主键。这里没有版本:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                     assembly="BpSalesOrders.Domain"
                     namespace="BpSalesOrders.Domain">
  <class name="OrderRelease" table="OCBPORDRIL" mutable="true">
    <composite-id>
      <key-property name="Company" column="ORLSOCIETA" type ="String" length="5"></key-property>
      <key-property name="OrderNumber" column="ORLORDINE" type ="String" length="10"></key-property>
      <key-property name="RequestDate" column="ORLDATARICHIESTA" type ="Int32"></key-property>
    </composite-id>
    <property name="Status" column="ORLSTATUS" type="Char" length="1"></property>
    <property name="StatusMessage" column="ORLSEGNALAZIONE" type="String" length="90"></property>
    <property name="ProcessingDate" column="ORLDATAELABORA" type ="Int32"></property>
  </class>
</hibernate-mapping>

考虑到关系是一对多,我想将 Orders 和 OrderRelease 表加入 OrderNumber 和 Company 上。如果我尝试这样做(如示例中所示),nHibernate 会抛出一个异常,告诉我它尝试映射的键由 3 个字段组成。

有没有办法创建一个不存在的列,该列不会被持久化,以便我可以设置我的映射和关系?

任何帮助将不胜感激。

I am working with an Oracle legacy database and I am trying to map a relationship with two tables. Unfortunately the company who designed the database used composite keys.

I've got this table (ORDERS) which has a primary key composed on 3 fields: ordernumber (number), version and company.

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BpSalesOrders.Domain"
                   namespace="BpSalesOrders.Domain">
  <class name="Order" table="OCSAORH" mutable="false" where="OCHAMND = 0">
    <cache usage="read-only"/>
    <composite-id>
      <key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
      <key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
      <key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
    </composite-id>
    <property name="Reference" column="OCHOCNO" type="String" length="25"></property>
    <property name="Date" column="OCHOCDT" type="Int32"></property>
    <property name="Status" column="OCHSTA1" type="Char"></property>
    <property name="LineOfCreditStatus" column="OCHSTA4" type="Char"></property>
    <property name="WareHouse" column="OCHRESP" type="String"></property>
    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true" default="0"/>
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found ="ignore"/>
    </set>
    <set name="OrderReleases" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false">
      <key>
        <column name="ORLORDINE" not-null="true" />
        <column name="ORLSOCIETA" not-null="true"/>
      </key>
      <one-to-many class="OrderRelease" not-found ="ignore"/>
    </set>
  </class>
</hibernate-mapping>

There's a relation with OrderLines which works fine cause that table has the same exact key structure.
I am having problem with the OrderReleases relation. That table has got a primary key composed on a OrderNumber, Company and date. There's no version here:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                     assembly="BpSalesOrders.Domain"
                     namespace="BpSalesOrders.Domain">
  <class name="OrderRelease" table="OCBPORDRIL" mutable="true">
    <composite-id>
      <key-property name="Company" column="ORLSOCIETA" type ="String" length="5"></key-property>
      <key-property name="OrderNumber" column="ORLORDINE" type ="String" length="10"></key-property>
      <key-property name="RequestDate" column="ORLDATARICHIESTA" type ="Int32"></key-property>
    </composite-id>
    <property name="Status" column="ORLSTATUS" type="Char" length="1"></property>
    <property name="StatusMessage" column="ORLSEGNALAZIONE" type="String" length="90"></property>
    <property name="ProcessingDate" column="ORLDATAELABORA" type ="Int32"></property>
  </class>
</hibernate-mapping>

Considering that the relationship is one-to-many I would like to join the table Orders and OrderRelease on OrderNumber and Company. If I try to do that (as in the example) nHibernate throws an exception telling me that the key it's trying to map is composed with 3 fields.

Is there a way to create an non-existing column which wouldn't be persisted so that I can setup my mapping and relations?

Any help will be apreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

思慕 2024-10-27 13:04:30

最终创建了一个带有假列的视图。

Ended up creating a view with a fake column.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文