0

Hibernateマッピングに問題があります。私は3つのファイルを持っています、それらのそれぞれは休止状態のクラスのマッピングです:

  • Proyectos.hbm.xml:Proyectosクラス
  • UnidadesEmpresa.hbm.xml:UnidadesEmpresaクラス
  • CliUniEmps.hbm.xml; CliUniEmpクラス

私は最後のものに関連する問題を抱えています。そのコードはこれです:

<hibernate-mapping>
    <class name="com.dmsti.dominio.CliUniEmp" table="clientes_uniemps"  lazy="false" catalog="dms_hrm">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>

        <many-to-one name="cliente" entity-name="com.dmsti.dominio.Cliente"
        column="cliente_id" unique="false" not-null="false" />

        <many-to-one name="unidadEmpresa" entity-name="com.dmsti.dominio.UnidadEmpresa"
        column="uniemp_id" unique="false" not-null="false" />

    </class>
</hibernate-mapping>

すべてのファイルはhibernate.cfg.xmlによって適切に関連付けられており、通常はすべて機能します。それでは、私の現在の問題について深く説明しましょう。

私のHibernateファイルProyectos.hbm.xmlには、CliUniEmps.hbm.xml(およびそのテーブルはclientes_uniemps)で、以下に定義されているcliUniEmpというエンティティへの参照があります。

コード1。

 <many-to-one name="cliUniEmp" entity-name="com.dmsti.dominio.CliUniEmp"
     column="cli_uniemp_id"  unique="false" not-null="false" />

UnidadesEmpresa.hbm.xmlには、同じテーブルへの別の参照があります

コード2。

 <set name="clientes" table="clientes_uniemps"   catalog="dms_hrm"
         inverse="false" lazy="false" fetch="select" cascade="all" >
        <key>
            <column name="uniemp_id" not-null="true" />
        </key>
        <many-to-many entity-name="com.dmsti.dominio.Cliente">
            <column name="cliente_id" not-null="true" />
        </many-to-many>
         </set>     

どちらか一方だけが存在する場合、両方のコードは正しく機能します。UnidadesEmpresa.hbm.xmlからセット「clientes」(コード2)を削除すると 、多対1のエンティティ「cliUniEmp」(コード1)は問題なく機能します。同様に、コード1を削除すると、コード2は完全に機能します。

アプリケーションで両方が同時に存在する場合、Hibernateは例外を起動します。

org.hibernate.MappingException:外部キー(FKE442A80E4FB5975E:proyectos [cli_uniemp_id]))には、参照される主キー(clientes_uniemps [uniemp_id、cliente_id])と同じ数の列が必要です。

行き詰まりました!助けてくれますか?

4

1 に答える 1

0

でテーブル名の衝突が発生していclientes_uniempsます。

オブジェクトモデルについて、次のように考えてください。3つのエンティティCliUniEmp、、、ProyectoおよびUnidadesEmpresa。これら3つのそれぞれに独自のテーブルが必要です。次に、それらの間に関係があります:CliUniEmpN <-> N UnidadedEmpresaCliUniEmp1<->N Proyecto

これらの関係は両方とも、一方のエンティティのIDをもう一方のエンティティのIDにマップする方法を必要とします。1 <-> Nの関係の場合、テーブルには直接ProyectoのIDを含めることができます。これは問題ありません。CliUniEmp

N <-> Nの場合、それはできません。IDのペアを含む介在テーブルが必要です。の要素のtable属性は、そのテーブルの名前を定義します。これについては、 Hibernateのドキュメントで読むことができます。setUnidadesEmpresa.hbm.xml

また、@ JoinTableアノテーションを使用して、関連付けテーブルと結合条件を記述する必要があります。

あなたの場合の特定の問題は、エンティティリレーションシップテーブルの両方に同じテーブル名を使用していることです。それらは異なっている必要があります。アソシエーションテーブルまたはエンティティテーブルの名前を変更すれば、問題ありません。CliUniEmp

于 2013-03-25T15:42:26.067 に答える