2009-11-10 59 views
1

如下:<Sql-insert>对我有一个对象映射为子类

<class name="A" table="TableA"> 
    <id name="ID" column="AId" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <discriminator column="Type" type="Int32" /> 
    <property name="Description" /> 
</class> 

<subclass name="B" discriminator-value="0" extends="A"> 
    <property name="B_specific_properties /> 
</subclass> 

<subclass name="C" discriminator-value="1" extends="A"> 
    <property name="C_specific_properties /> 
</subclass> 

我打算使用一个存储过程来完成插入,而目前B和C使用相同的存储过程来插入进入桌子。我的问题是与上面映射的对象,sql插入是否属于类A?如果是这样,它是否期望对对象A执行save()?当我正在保存时,如何让它识别B和C的附加属性?

OR

使用一个存储过程来保存两个子类的不可能完成的任务,虽然他们属于同一个表?

非常感谢您的任何意见!

回答

0

我会告诉你我是如何做到这

<class name="CompanyCharacteristic" table="firma_cecha" abstract="true" discriminator-value="not null"> 
    <id name="Id" column="id_firma_cecha"> 
     <generator class="native" /> 
    </id> 
    <discriminator column="typ_cechy"/> 
    <property name="FriendlyTypeName" column="typ_cechy" insert="false" update="false"/> 

    <property name="All" column="cecha_all" access="nosetter.camelcase"/> 

    <!-- Auditing data --> 
    <property name="UserInserted" access="nosetter.camelcase" column="user_insert" insert="true" update="false"/> 
    <property name="DateInserted" column="data_insert" generated="insert" insert="false" update="false"/> 

    <subclass discriminator-value="Akceptacja kart płatniczych" name="CreditCardAcceptanceCharacteristic"> 
     <property name="DoesIt" column="cecha_dec_1" not-null="true" type="DataAccess.NHibernate.Infrastructure.UserTypes.EnumValueInfoUserType`1[[Domain.Characteristics.YesNoNumericEnum, Domain]], DataAccess"/> 
     <sql-insert> 
      DECLARE @returned decimal(20,0) 
      exec sp_FirmaCecha_Add 
      @TypCechy = 'Akceptacja kart płatniczych', 
      @CechaAll = ?, 
      @UserInsertZrodlo = ?, 
      @CechaDec1 = ?, 
      @IdFirmaCecha = @returned OUTPUT 
      SELECT @returned 
     </sql-insert> 
     <sql-update> 
      exec sp_FirmaCecha_Update 
      @TypCechy = 'Akceptacja kart płatniczych', 
      @UserUpdateZrodlo = ?, 
      @CechaDec1 = ?, 
      @IdFirmaCecha = ? 
     </sql-update> 
     <sql-delete> 
      exec sp_FirmaCecha_Delete ? 
     </sql-delete> 
    </subclass> 

    <sql-insert> 
     raiserror ('CompanyInfoCharacteristic nie moze byc dodwana za pomocą NHibernate',11,1) 
    </sql-insert> 
    <sql-update> 
     raiserror ('CompanyInfoCharacteristic nie moze byc aktualizowana za pomocą NHibernate.',11,1) 
    </sql-update> 
    <sql-delete> 
     raiserror ('CompanyInfoCharacteristic nie moze byc kasowana za pomocą NHibernate.',11,1) 
    </sql-delete> 

正如你看到的每个子类中需要有自己的SQL语句。基类也可以有自己的语句。在这个例子中,我不允许通过NHibernate修改基类实例

+0

感谢您的回复。所以我明白了,我需要为对象B和C创建两个不同的存储过程,并且如果B和C中属性的数量不同,那么传递给存储过程的参数数量将不同于好? – Akey 2009-11-11 15:38:12