我的Hibernate Mapping有问题。我有三个文件,每个文件都是一个hibernate类的映射:
我遇到了与上一个相关的问题。它的代码如下:
<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])
我被卡住了!拜托,你能帮帮我吗?
答案 0 :(得分:0)
您在clientes_uniemps
上有一个表命名冲突。
以这种方式考虑您的对象模型:三个实体CliUniEmp
,Proyecto
和UnidadesEmpresa
。这三个中的每一个都应该有自己的表。然后是它们之间的关系:CliUniEmp
N&lt; - &gt; N UnidadedEmpresa
,CliUniEmp
1&lt; - &gt; N Proyecto
。
这两种关系都需要一种方法将一个实体的ID映射到另一个实体的ID。对于1&lt; - &gt; N关系,Proyecto
表可以直接包含CliUniEmp
的ID,这很好。
对于N&lt; - &gt; N,你不能这样做。必须有一个包含对 ID的干预表。 table
中set
元素中的UnidadesEmpresa.hbm.xml
属性定义了该表的名称。您可以在Hibernate docs中了解这一点,他们会说:
您还必须描述关联表和连接 使用@JoinTable注释的条件。
您的案例中的具体问题是,您已为CliUniEmp
实体和关系表使用了相同的表名。他们必须是不同的。更改关联表的名称或实体表,您就可以了。