我正在處理的應用程序需要支持3個數據庫。 Sybase,SQL和Oracle。讓2個不同的映射文件在同一個域中工作
現在我們對Oracle有一個問題。至於oracle,我們使用序列作爲id生成器,對於Sybase和Oracle,我們使用自己的實現來生成一個ID。
我們有一個由雙主鍵組成的表的問題。我的映射文件由一個composite-id組成。但是在複合標識中,您無法使用生成的值。對於Oracle和Sybase,這是沒有問題的,因爲我手動創建新的ID。對於Oracle,但我確實有問題,因爲需要使用序列。
所以我在做的是創建第二個特定於Oracle的映射文件,該文件只使用1個字段作爲PK。我的查詢將不會是正確的,但我看不出有任何其他選項,這樣做..
所以我有2個映射文件:
Sybase和SQL:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
namespace="VS3.Domain.Address" assembly="VS3.Domain">
<class name="Top_Address" table="TOP_ADDRESS">
<composite-id name="ID" class="IDComposite_TopAddress">
<key-property name="TnrAddress" column="TNR_ADDRESS" type="Int32"/>
<key-many-to-one name="TopIdentity" class="Top_Identity" column="TNR_ID"/>
</composite-id>
<property name="nmAddress" column="NM_ADDRESS" type="String" not-null="true"/>
<property name="dPosx" column="D_POSX" type="Decimal" not-null="false"/>
<property name="dPosy" column="D_POSY" type="Decimal" not-null="false"/>
<property name="nmStreetAdd" column="NM_STREET_ADD" type="String" not-null="false"/>
<property name="nmStreetAdd2" column="NM_STREET_ADD2" type="String" not-null="false"/>
<property name="nmStreetAdd3" column="NM_STREET_ADD3" type="String" not-null="false"/>
<!-- Added By Transics -->
<property name="HouseNumber" column="CNR_HOUSE_ADD" type="String" not-null="false" />
<property name="BusNumber" column="CNR_BUS_ADD" type="String" not-null="false" />
<property name="PostalCode" column="CNR_ZIP" type="String" not-null="false" />
<property name="City" column="NM_ZIP" type="String" not-null="false" />
<property name="Country" column="COD_COUNTRY" type="String" not-null="false" />
<property name="Email" column="CNR_EMAIL_ADD" type="String" not-null="false" />
<property name="Phone" column="CNR_PHONE_ADD" type="String" not-null="false" />
<property name="CellPhone" column="CNR_GSM_ADD" type="String" not-null="false" />
<property name="NmAddress2" column="NM_ADDRESS2" type="String" not-null="false" />
<property name="Active" column="BOL_ACTIVE_ADD" type="Int32" not-null="false" />
<property name="Language" column="COD_LANG" type="String" not-null="false" />
<property name="AmFrom" column="T_TRB_AM_FROM" type="DateTime" not-null="false" />
<property name="AmUntil" column="T_TRB_AM_UNTIL" type="DateTime" not-null="false" />
<property name="PmFrom" column="T_TRB_PM_FROM" type="DateTime" not-null="false" />
<property name="PmUntil" column="T_TRB_PM_UNTIL" type="DateTime" not-null="false" />
<property name="Remark" column="DES_TRB_REMARK" type="String" not-null="false" />
<property name="ExtraInformation" column="TXT_ADDRESS" type="String" not-null="false" />
<property name="AddressType" column ="COD_ADDRESSTYPE" type="Char" not-null="false" />
<property name="AddressOrPlace" column ="COD_TRB_ADDRESSTYPE" type="String" not-null="false" />
</class>
</hibernate-mapping>
甲骨文:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
namespace="VS3.Domain.Address" assembly="VS3.Domain">
<class name="Top_Address_Oracle" table="TOP_ADDRESS">
<id name="TnrAddress" column="TNR_ADDRESS" type="Int32">
<generator class="sequence" />
</id>
<property name="nmAddress" column="NM_ADDRESS" type="String" not-null="true"/>
<property name="dPosx" column="D_POSX" type="Decimal" not-null="false"/>
<property name="dPosy" column="D_POSY" type="Decimal" not-null="false"/>
<property name="nmStreetAdd" column="NM_STREET_ADD" type="String" not-null="false"/>
<property name="nmStreetAdd2" column="NM_STREET_ADD2" type="String" not-null="false"/>
<property name="nmStreetAdd3" column="NM_STREET_ADD3" type="String" not-null="false"/>
<property name="HouseNumber" column="CNR_HOUSE_ADD" type="String" not-null="false" />
<property name="BusNumber" column="CNR_BUS_ADD" type="String" not-null="false" />
<property name="PostalCode" column="CNR_ZIP" type="String" not-null="false" />
<property name="City" column="NM_ZIP" type="String" not-null="false" />
<property name="Country" column="COD_COUNTRY" type="String" not-null="false" />
<property name="Email" column="CNR_EMAIL_ADD" type="String" not-null="false" />
<property name="Phone" column="CNR_PHONE_ADD" type="String" not-null="false" />
<property name="CellPhone" column="CNR_GSM_ADD" type="String" not-null="false" />
<property name="NmAddress2" column="NM_ADDRESS2" type="String" not-null="false" />
<property name="Active" column="BOL_ACTIVE_ADD" type="Int32" not-null="false" />
<property name="Language" column="COD_LANG" type="String" not-null="false" />
<property name="AmFrom" column="T_TRB_AM_FROM" type="DateTime" not-null="false" />
<property name="AmUntil" column="T_TRB_AM_UNTIL" type="DateTime" not-null="false" />
<property name="PmFrom" column="T_TRB_PM_FROM" type="DateTime" not-null="false" />
<property name="PmUntil" column="T_TRB_PM_UNTIL" type="DateTime" not-null="false" />
<property name="Remark" column="DES_TRB_REMARK" type="String" not-null="false" />
<property name="ExtraInformation" column="TXT_ADDRESS" type="String" not-null="false" />
<property name="AddressType" column ="COD_ADDRESSTYPE" type="Char" not-null="false" />
<property name="AddressOrPlace" column ="COD_TRB_ADDRESSTYPE" type="String" not-null="false" />
<many-to-one name="Identity" class="Identity" column="TNR_ID" not-null="true"/>
</class>
</hibernate-mapping>
有沒有什麼辦法可以確保這些映射文件使用相同的Domain類?或者我也需要創建一個新域名(就像我目前那樣)。
但這不是一個真正的選擇。會很多工作。
有沒有人有解決方案?
謝謝:)這已經有點幫助我了。在我的域中(正如你可以在我的映射文件中看到的那樣)我爲PK創建了一個類。我的oracle映射文件不是這種情況。 我正在使用它來檢索我的服務中的某些值等。例如:CreateCriteria(DB,typeof(Top_Address)) .Add(Expression.Eq(「ID.TnrAddress」,addressID)) .Add(Expression.Eq(「ID.TopIdentity.tnrId」,tnrID)) 。 Add(Expression.Eq(「AddressType」,'R')) .UniqueResult(); 這樣做,如果我這樣做,而不改變我的域名,只有映射? –
JeremyVm
2011-04-04 13:16:37
@JeremyVm看到我的編輯來解決你的問題。 – 2011-04-04 14:45:27
謝謝!也是我想要做的,但希望有一個更好的解決方案.. – JeremyVm 2011-04-04 15:21:17