0

我的休眠映射有问题。我有三个文件,每个文件都是一个休眠类的映射:

  • 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中,我引用了一个名为cliUniEmp的实体,该实体在 CliUniEmps.hbm.xml 中定义如下(其表为 clientes_uniemps)。

代码 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), 那么多对一实体“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.

以这种方式考虑您的对象模型:三个实体CliUniEmpProyectoUnidadesEmpresa。这三个中的每一个都应该有自己的表。然后是它们之间的关系:CliUniEmpN<->N UnidadedEmpresaCliUniEmp1<->N Proyecto

这两种关系都需要一种将一个实体的 ID 映射到另一个实体的 ID 的方法。对于 1<->N 的关系,Proyecto表中可以直接包含 ID 就可以了CliUniEmp

对于 N<->N,你不能这样做。必须有一个包含ID对的中间表。元素中的table属性定义了该表的名称。你可以在Hibernate docs中阅读到这一点,他们说:setUnidadesEmpresa.hbm.xml

您还必须使用 @JoinTable 注释来描述关联表和连接条件。

您的具体问题是您为实体关系表使用了相同的表名。他们必须不同。更改关联表的名称或实体表的名称,就可以了。CliUniEmp

于 2013-03-25T15:42:26.067 回答