与外键相关的Hibernate Mapping异常

时间:2013-03-25 13:17:24

标签: hibernate exception mapping foreign-key-relationship

我的Hibernate Mapping有问题。我有三个文件,每个文件都是一个hibernate类的映射:

  • Proyectos.hbm.xml:Proyectos类
  • UnidadesEmpresa.hbm.xml:UnidadesEmpresa class
  • 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])

我被卡住了!拜托,你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您在clientes_uniemps上有一个表命名冲突。

以这种方式考虑您的对象模型:三个实体CliUniEmpProyectoUnidadesEmpresa。这三个中的每一个都应该有自己的表。然后是它们之间的关系:CliUniEmp N&lt; - &gt; N UnidadedEmpresaCliUniEmp 1&lt; - &gt; N Proyecto

这两种关系都需要一种方法将一个实体的ID映射到另一个实体的ID。对于1&lt; - &gt; N关系,Proyecto表可以直接包含CliUniEmp的ID,这很好。

对于N&lt; - &gt; N,你不能这样做。必须有一个包含 ID的干预表。 tableset元素中的UnidadesEmpresa.hbm.xml属性定义了该表的名称。您可以在Hibernate docs中了解这一点,他们会说:

  

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

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