7

Hibernate3.2.5を使用しています。多対1のマッピングを使用しているときに、上記の例外が発生します。トレーニングテーブルは、部門テーブルと多対1の関係にあります。つまり、1つのDepatementは複数のトレーニングを受けることができます。

例外はinsert="false" update="false"、hbmファイルに追加するように要求することです。このビットを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>

その後、コードが機能します。これを追加する正確な理由を知りたいです。

よろしく、

4

3 に答える 3

8

ここでは、DEPT_ID列を2回マップしました。

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

そしてここ:

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

selectステートメントを実行すると、Hibernateは同じ列からオブジェクトの2つのプロパティを正しく入力しますが、挿入または更新を実行すると、データベースに保持するプロパティを決定できません。

そもそも同じ列に2つのプロパティをマッピングする必要があるのはなぜですか?deptIdにアクセスする必要がある場合は、おそらくdeptIdプロパティを削除して、代わりに

training.getDepartmentDetails().getId()
于 2012-11-10T15:07:02.653 に答える
6

このシナリオのエラーメッセージは非常に明確です(ここには記載していませんが、何度か見ました)。DEPT_ID問題は、列をクラスの2つの異なるフィールドにマップしたことです。

最初に、それをプロパティにマップしdeptId、次ににマップしましたdepartmentDetails。ご存知のように、hibernateは、マッピングの1つがに構成されている場合にのみこれを実行できますinsert="false" update="false"

その理由は非常に単純です。別のIDに変更する場合deptId、hibernateはにマップされているクラスを変更する必要がありdepartmentDetailsます。これは非常に複雑です。

deptIdを取得する必要がある場合は、Trainingを返すgetDeptIdメソッドを追加できますdepartmentDetails.getId()。そして、を提供しないでくださいsetDeptId

于 2012-11-10T15:05:42.390 に答える
1

マッピングファイルで同じ列名を2回使用している場合。マッピング例外が発生する可能性があります

Initial SessionFactory creation failed.org.hibernate.MappingException:

また、uマークがinsert=flaseおよびupdate=falseの場合。

テーブルまたは別のレガシーシステムのレコードを更新または挿入しようとした場合は、これらの列の値を更新してみてください。そのファイルを更新または挿入しません。

以下のリンクを確認してください。解決策を見つけるのに役立ちます。

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

SandeepGに感謝します。

于 2012-11-10T22:23:37.873 に答える