2012-05-02 15 views
0

NHibernateを使用して複数のレベルのサブクラスをマップしようとしていますが、これは初心者であることを認める必要があります。私がマッピングしているデータは、ネットワークパケットキャプチャです。複数レベルのサブクラスNHibernateを持つクラスのマッピング

基本的には、私のデータベースのテーブルにオブジェクトの相続のさまざまなレベルを分けることができるので、例えば、私がTCPパケットを受け取ったとき、タイムスタンプのような非常に一般的なデータが'Packets'テーブルに格納され、より具体的なデータはそれぞれのテーブルに格納されます。 'IP'テーブルのIPヘッダーと 'TCP'テーブルのTCPヘッダーです。

マイマッピング

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="WindowsFormsApplication1.BasePacket, WindowsFormsApplication1" table="Packets" lazy="false"> 

    <id name="ID" column="ID"> 
     <generator class="identity" /> 
    </id> 

    <property name="timeStamp" column="timeStamp" type="datetime"></property> 

    <joined-subclass table="IP" name="WindowsFormsApplication1.IP, WindowsFormsApplication1" lazy="false"> 
     <key column="IPID"/> 

     <property name="identification" column="identification" type="UInt16"></property> 
     <property name="sourceIP" column="sourceIP" type="BinaryBlob" ></property> 
     <property name="destinationIP" column="destinationIP" type="BinaryBlob"></property> 
     <property name="version" column="version" type="int"></property> 
     <property name="IPHeaderLength" column="IPHeaderLength" type="byte"></property> 
     <property name="sizeOfDatagram" column="sizeOfDatagram" type="UInt16"></property> 
     <property name="reserved" column="reserved" type="bool"></property> 
     <property name="dontFragment" column="dontFragment" type="bool"></property> 
     <property name="moreFragments" column="moreFragments" type="bool"></property> 
     <property name="fragmentOffset" column="fragmentOffset" type="UInt16"></property> 
     <property name="timeToLive" column="timeToLive" type="byte"></property> 
     <property name="protocol" column="protocol" type="int"></property> 
     <property name="headerChecksum" column="headerChecksum" type="UInt16"></property> 
     <property name="additionalData" column="additionalData" type="BinaryBlob"></property> 

     <joined-subclass table="TCP" name="WindowsFormsApplication1.TCP, WindowsFormsApplication1" lazy="false"> 
     <key column="TCPID"/> 

     <property name="sourcePort" column="sourcePort" type="UInt16"></property> 
     <property name="destinationPort" column="destinationPort" type="UInt16"></property> 
     <property name="ISN" column="ISN" type="long"></property> 
     <property name="ASN" column="ASN" type="long"></property> 
     <property name="innerProtocolHeaderLength" column="innerProtocolHeaderLength" type="byte"></property> 
     <property name="FIN" column="FIN" type="bool"></property> 
     <property name="SYN" column="SYN" type="bool"></property> 
     <property name="RST" column="RST" type="bool"></property> 
     <property name="PSH" column="PSH" type="bool"></property> 
     <property name="ACK" column="ACK" type="bool"></property> 
     <property name="URG" column="URG" type="bool"></property> 
     <property name="windowSize" column="windowSize" type="UInt16"></property> 
     <property name="checksum" column="checksum" type="UInt16"></property> 
     <property name="urgentPointer" column="urgentPointer" type="UInt16"></property> 
     <property name="options" column="options" type="BinaryBlob"></property> 
     <property name="payload" column="payload" type="BinaryBlob"></property> 
     <property name="anomalies" column="anomalies" type="string"></property> 
     </joined-subclass> 

     <joined-subclass table="UDP" name="WindowsFormsApplication1.UDP, WindowsFormsApplication1" lazy="false"> 
     <key column="UDPID"/> 

     <property name="sourcePort" column="sourcePort" type="UInt16"></property> 
     <property name="destinationPort" column="destinationPort" type="UInt16"></property> 
     <property name="length" column="length" type="UInt16"></property> 
     <property name="checksum" column="checksum" type="UInt16"></property> 
     <property name="payload" column="payload" type="BinaryBlob"></property> 
     </joined-subclass> 

     <joined-subclass table="ICMP" name="WindowsFormsApplication1.ICMP, WindowsFormsApplication1" lazy="false"> 
     <key column="ICMPID"/> 

     <property name="type" column="type" type="byte"></property> 
     <property name="code" column="code" type="byte"></property> 
     <property name="checksum" column="checksum" type="UInt16"></property> 
     <property name="additionalDataICMP" column="additionalDataICMP" type="BinaryBlob"></property> 
     </joined-subclass> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

私はこのマッピングを使用して私のプログラムを実行しようとすると、私はこのエラーメッセージ、または異なるサブクラスを参照すると、同様のものを受け取ります。

'NHibernate.Exceptions.GenericADOException' タイプの未処理の例外がNHibernate.dll

で発生した*

追加情報:挿入できませんでした:[WindowsFormsApplication1.UDP] [SQL:INSERT INTOパケット(timeStampに)VALUES(? ); SELECT LAST_INSERT_ID()] *

これは私のNHibernateの理解に欠けていると確信して、非常にあなたの助けに感謝します。

+0

は完全なスタックトレースを示します。おそらくマッピングエラーであり、データベースは一部の列が不明であると不満を表明します – Firo

答えて

0

ID列(ID)は実際にデータベースに自動インクリメント/アイデンティティとして定義されていますか?

タイムスタンプはデータベースのタイムスタンプ列ですか? nhibernateがそれに挿入しようとしているので、あなたはaccess = "readonly"が必要な場合です。

また、あなたの最初に参加したサブクラスには、それがないか、または最後のICMPテーブルの後ろに間違っているようです。あなたの意図が間違っていて、それらをネストする必要がない限り。

関連する問題