1

リストに同様の質問がいくつかあることは知っていますが、特定の問題の解決策にそれらをねじることはできませんでした。

hibernate3構成にXMLマッピングファイルを使用しています。ベースオブジェクトと複数のアタッチメントオブジェクトの間に一方向の関係のグループを作成する必要があります。(添付ファイルはベースオブジェクト上の複数のサイトに接続でき、各添付ファイルポイントは多くの添付ファイルを保持できます。添付ファイルのリストを個別に追跡する必要があります。)しかし、これを行うと、「エンティティのマッピングで繰り返し列」という例外が発生します。

org.hibernate.MappingException: Repeated column in mapping for entity: ATTACHMENT column: attachmentID (should be mapped with insert="false" update="false")

私を混乱させているのは、ベースオブジェクトマッピングがリストインデックスとして「attachmentID」のみを使用し、選択キーは使用しないことです。

例外を回避するためにこれらのマッピングファイルを設定する方法を教えてもらえますか?このフォーラムで回答された他の同様の質問はすべて注釈を使用していますが、XMLを使用する必要があります。

これは私の添付ファイルです。3種類のアタッチメントポイントを識別します。1つの基本オブジェクトタイプには2つの可能なアタッチメントポイントがあり、もう1つには1つしかありません。ベースポイントの1つに接続すると、適切なオブジェクトIDでそのベースオブジェクトのIDを取得し、残りは-1(特別なベースレコード)に設定されます。

(もちろん、これらのマッピングは大幅に削減されていますが、すべてのインポート機能をキャプチャしたと思います。)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="attachment" table="ATTACHMENT">
      <id column="attachmentID" name="attachmentID" type="int">
          <generator class="identity"></generator>
      </id>

      <property name="idBase1"></property>
      <property name="idBase2"></property>
      <property name="idAltBase1"></property>

  </class>
</hibernate-mapping>

これは、ベースオブジェクトのマッピングファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="base" table="BASE">
      <id column="IDBASE" name="idBase" type="int">
          <generator class="identity"></generator>
      </id>

    <property name="type"></property>

    <list name="attachment1" cascade="all">
        <key column="idBase1" not-null="true" />
        <list-index column="attachmentID" base="0" />
        <one-to-many class="ATTACHMENT"/>
    </list>

    <list name="attachment2" cascade="all">
        <key column="idBase2" not-null="true"/>    
        <list-index column="attachmentID" base="0" />
        <one-to-many class="ATTACHMENT"/>
    </list>
  </class>
</hibernate-mapping>

これは、代替ベースオブジェクトのマッピングファイルです。プライマリベースオブジェクトと同じように見えますが、添付ファイルのリストは1つだけです。そして、これは大丈夫だと思います。または、少なくとも、このマッピングによって例外がスローされていません。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="altBase" table="BASE">
      <id column="IDBASE" name="idBase" type="int">
          <generator class="identity"></generator>
      </id>

    <property name="type"></property>

    <list name="idAltBase1" cascade="all">
        <key column="idBase1" not-null="true" />
        <list-index column="attachmentID" base="0" />
        <one-to-many class="ATTACHMENT"/>
    </list>
  </class>
</hibernate-mapping>
4

1 に答える 1

1

アタッチメントは外部キーを維持するため、アタッチメントが外部キーを維持することをHに伝えるには、1対多側で逆を設定する必要があります。

<list name="idAltBase1" cascade="all" inverse="true">

また、外部キーを添付して表示したい場合は、参照としてマップしてみませんか。

  <many-to-one name="base1" column="idBase1"/>
  <many-to-one name="base2" column="idBase2"/>
  <many-to-one name="altBase1" column="idAltBase1"/>

注:getBase1()。getId()は、Base1行の選択を発行しません。

于 2012-05-03T05:56:50.390 に答える