0

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

基本的に、オブジェクトのさまざまなレベルの継承をデータベース内のテーブルに分割できるようにしたいので、たとえば、TCPパケットを受信すると、タイムスタンプなどの非常に一般的なデータが「パケット」テーブルに格納されます。 、およびより具体的なデータは、それぞれのテーブルに格納されます。たとえば、「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 Packets(timeStamp)VALUES(?); SELECT LAST_INSERT_ID()] *

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

4

1 に答える 1

0

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

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

また、最初に結合されたサブクラスが欠落しているか、最後のICMPテーブルの後に間違った場所にあるようです。意図を見逃してネストしたい場合を除きます。

于 2012-05-25T02:59:27.217 に答える