我正在使用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>
然后代码有效。我想知道添加它的确切原因是什么。
此致
答案 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。