org.hibernate.MappingException:实体映射中的重复列

时间:2012-11-10 14:33:15

标签: java hibernate

我正在使用Hibernate 3.2.5。我在使用多对一映射时遇到上述异常。训练表与Department表具有多对一关系,即One Depatement能够进行多次训练。

例外是要求我在我的hbm文件中添加insert="false" update="false"。如果我在hbm文件中添加这个位,那么代码工作正常。

这是hbm文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="com.infy.model.Training" table="training">
  <id name="Id" type="integer" column="ID">
      <generator class="assigned"></generator>
  </id>      
  <property name="trainerName">
      <column name="TRAINER_NAME"></column>
  </property>
  <property name="deptId">
      <column name="DEPT_ID"></column>
  </property>
  <property name="trainingSubject">
      <column name="TRAINING_SUBJECT"></column>
  </property>
  <many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one>
  </class>
</hibernate-mapping>

如果我将此行更改为:

<many-to-one name="departmentDetails" column="DEPT_ID" insert="false" update="false"></many-to-one>

然后代码有效。我想知道添加它的确切原因是什么。

此致

3 个答案:

答案 0 :(得分:8)

您已将DEPT_ID列映射两次,此处为:

  <property name="deptId">
      <column name="DEPT_ID"></column>
  </property>

在这里:

  <many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one>

执行select语句时,Hibernate可以很好地从同一列填充对象的两个属性,但是在执行插入或更新时,它无法决定在数据库中保留哪个属性。

为什么首先需要将两个属性映射到同一列?如果您需要访问deptId,您可以删除deptId属性,而不是

training.getDepartmentDetails().getId()

答案 1 :(得分:6)

这个场景的错误信息非常清楚(你没有把它放在这里,但我已经看过几次了)。问题是您已将列DEPT_ID映射到班级中的两个不同字段。

首先,您已将其映射到属性deptId,然后再映射到departmentDetails。正如您所知,只有在其中一个映射配置为insert="false" update="false"时,hibernate才允许执行此操作。

原因很简单。如果你将deptId更改为另一个id,hibernate将需要更改departmentDetails中映射的类,这非常复杂。

如果您需要获取deptId,可以在Training上添加一个返回departmentDetails.getId()的getDeptId方法。并且不提供setDeptId

答案 2 :(得分:1)

如果在映射文件中使用两次相同的列名。可能是你得到映射异常

Initial SessionFactory creation failed.org.hibernate.MappingException:

如果你标记insert = flase和update = false。

如果您尝试更新或插入表或其他旧系统中的记录,请尝试更新这些列值。它不会更新或插入该文件。

请查看以下链接。这将有助于找到您的解决方案。

http://www.techienjoy.com/hibernate-insert-update-control.php

由于 Sandeep G。