2014-03-04 33 views
1

原諒我我是NHibernate的新手,我在下面的hbm.xml中發現了一些例子。鑑別器用於什麼?

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="test" > 

     <class name="test.FieldSetMapping" table="fieldsetmapping" discriminator-value="2352" lazy="false"> 
     <id name="Id" column="fieldsetmapping_id" type="Int64"> 
      <generator class="test.NHibernate.IdGenerator, test"> 
       <param name="table">nextinstanceid</param> 
       <param name="column">next</param> 
       <param name="max_lo">9</param> 
      </generator> 
     </id> 
     <discriminator column="mapping_type" type="Int32" /> 
     <version name="LastUpdateNumber" column="last_update_number" type="Int32" unsaved-value="-1"/> 
     <property name="OwnerName" column= "owner_name" type="String"/> 
     <component name="FieldSetDefinitionId" class="test.ObjectId"> 
      <property name="InstanceId" column= "fieldsetdefinition_id" type="Int64"/> 
     </component>  
     <property name="OwnerTypeClassId" column= "owner_type" /> 
     <bag name="FieldMappings" cascade="all-delete-orphan" generic="true" lazy="false"> 
      <key column="fieldsetmapping_id" not-null="true" /> 
      <one-to-many class="test.FieldSet.FieldMapping, test" /> 
     </bag> 
     <property name="MappingHandlerClass" column="handler_class" /> 
     </class> 
     <subclass name="test.EntityFieldSetMapping, test" discriminator-value="2353" extends="test.FieldSetMapping, test" lazy="false" > 
     <property name="TargetEntityType" type="test.Internal.NHibernate.ClassIdType, test" not-null="false"> 
      <column name="target_entity_type"/> 
     </property> 
     </subclass> 
     <class ...> 
     ... 
     </class> 
     <class ...> 
     ... 
     </class> 
    </hibernate-mapping> 

但我不知道鑑別器是什麼意思。我檢查了Nhibernate Doc 5.1.6

The <discriminator> element is required for polymorphic persistence 
using the table-per-class-hierarchy mapping strategy and declares a discriminator 
column of the table. The discriminator column contains marker values that tell 
the persistence layer what subclass to instantiate for a particular row.A restricted 
set of types may be used: String, Char, Int32, Byte, Short, Boolean, YesNo, TrueFalse. 

這是否意味着如果mapping_type> 2352的NH將初始化子類test.EntityFieldSetMapping爲表fieldsetmapping的行?謝謝。

回答

3

NHibernate將使用鑑別器來檢測哪個類需要在多態場景中實例化。

  • 如果mapping_type = 2352,它會創建的test.FieldSetMapping

  • 的情況下,如果mapping_type = 2353,它會創建的test.EntityFieldSetMapping

實例任何其他值應產生一個異常。