1

新しく追加されたクラスに永続化を追加しようとしています。私が始めたとき、オブジェクトのリストを単にラップするTournamentタイプのメンバーで名前が付けられたクラスがありました。これは、クラスの休止状態のマッピングです。これは id であり、他のフィールドは省略されています。ScheduleSession

<hibernate-mapping default-access="field">
  <class name="fully.qualified.class.Tournament" table="tournaments">
    <component name="schedule" class="fully.qualified.class.Schedule">
      <list name="sessions" cascade="all-delete-orphan" lazy="true" table="tournament_sessions" >
        <key column="tournament_id" not-null="true"/>
        <index column="session_index"/>
        <one-to-many class="fully.qualified.class.Session"/>
      </list>
    </component>
  </class>
</hibernate-mapping>

ここで、セッションテーブルを複製して呼び出した新しいクラスを作成する必要がありますOtherThing。上記のものと非常によく似た休止状態のマッピングも作成しました。Schedule.other_thing_sessions.

<hibernate-mapping default-access="field">
  <class name="fully.qualified.class.OtherThing" table="other_things">
    <component name="schedule" class="fully.qualified.class.Schedule">
      <list name="sessions" cascade="all-delete-orphan" lazy="true" table="other_thing_sessions" >
        <key column="other_thing_id" not-null="true"/>
        <index column="session_index"/>
        <one-to-many class="fully.qualified.class.Session"/>
      </list>
    </component>
  </class>
</hibernate-mapping>

驚いたことに、これにより次のエラーが発生しました。

org.hibernate.MappingException: Repeated column in mapping for entity: fully.qualified.class.Session column: session_index (should be mapped with insert="false" update="false")

休止状態は、このクラスを繰り返し使用することを好まないようです。そのentity-name="OtherThingSession"ため、1 対多の要素に属性を追加してみました。今、私はこのエラーを持っています:

org.hibernate.MappingException: Association references unmapped class: OtherThingSession

これは私を一瞬うんざりさせたので、戻って元のエラーを調べました. 新しいマッピングでインデックス列の名前を変更することにしました。これは休止状態から苦情を受けませんでしたが、永続化は機能しませんでした。tournament_sessions永続化しようとしたときに、セッションオブジェクトをテーブルに挿入しようとしたようですOtherThing.

誰でもこの問題を解決する方法について何か考えがありますか?

4

1 に答える 1

1

クラスを2回マップすることはできません。Hibernateはこれを処理できません。あなたが見てきたように、あなたはより奇妙なエラーを得るでしょう。(また、クラスが2回マップされると、第1レベルのキャッシュが正しく機能しません。これは、Hibernateがクラスを使用して、キャッシュされたインスタンスが属するテーブルを決定するためです。uniqueResult(で2つのインスタンス(および例外)を取得する効果がありました。 )テーブルには1つしかないと思いました。)

あなたができること:

たとえば、機能を追加せずにSessionを拡張する2つの「空の」クラスを作成します。

public class TournamentSession extends Session {}

public class OtherSession extends Session {}

次に、一方の<one-to-many>属性でを使用TournamentSessionし、もう一方の属性でを使用しますOtherSessionSessionそれ自体をマップしたり、Hibernate属性で使用したりすることはできません。

于 2013-01-18T07:51:45.460 に答える