学生とクラスの2つのクラスがあります。各生徒は、1 つのクラスにのみ参加できます。
次のコードを使用して Student を挿入しようとしています
for (Class cls : classList) {
if (cls.getId().getClassId() == selectedClassId.intValue()) {
selectedStudent.setClass(cls);
}
}
HibernateUtil.beginTransaction();
StudentHome stuhome = new StudentHome();
stuhome.persist(selectedStudent);
HibernateUtil.commitTransaction();
しかし、何らかの理由で、Hibernate は classId フィールドを Student テーブルに挿入していません。
以下は、Hibernate から取得した SQL 出力です。
Hibernate:
select
class_.ClassId,
class_.EntityId,
class_.ClassName as ClassName2_
from
school.class102 class_
where
class_.ClassId=?
and class_.EntityId=?
Hibernate:
insert
into
school.student102
(StudentId, ParentId, RouteId, FirstName, LastName, MiddleName, DoB, DoJ, DoL, Status, RegistrationId, EntityId)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ご覧のとおり、insert ステートメントには明らかに classId がありません。Hibernate が insert ステートメントに classId を含めていない理由がわかりません。
EntityId と RegistrationId は Student の PK であり、EntityId と ClassId は Class の PK です。両方のテーブルに (EntityId, ClassId) との外部キー関係があります。挿入は、定義済みの EntityId を持つビューを介して試行されます
問題は何ですか?
以下はマッピングです
<hibernate-mapping>
<class name="Student" table="student104" catalog="school">
<composite-id name="id" class="studentId">
<key-property name="registrationId" type="int">
<column name="RegistrationId" />
</key-property>
<key-property name="entityId" type="int">
<column name="EntityId" />
</key-property>
</composite-id>
<many-to-one name="class" class="class" update="false" insert="false" fetch="select">
<column name="ClassId" />
<column name="EntityId" not-null="true" />
</many-to-one>
<property name="studentId" type="java.lang.Integer">
<column name="StudentId" />
</property>
<property name="parentId" type="java.lang.Integer">
<column name="ParentId" />
</property>
<property name="routeId" type="java.lang.Integer">
<column name="RouteId" />
</property>
<property name="firstName" type="string">
<column name="FirstName" length="45" />
</property>
<property name="lastName" type="string">
<column name="LastName" length="45" />
</property>
<property name="middleName" type="string">
<column name="MiddleName" length="45" />
</property>
<property name="doB" type="date">
<column name="DoB" length="10" />
</property>
<property name="doJ" type="date">
<column name="DoJ" length="10" />
</property>
<property name="doL" type="date">
<column name="DoL" length="10" />
</property>
<property name="status" type="string">
<column name="Status" length="45" />
</property>
</class>
<hibernate-mapping>
<class name="class" table="class102" catalog="school">
<composite-id name="id" class="classId">
<key-property name="classId" type="int">
<column name="ClassId" />
</key-property>
<key-property name="entityId" type="int">
<column name="EntityId" />
</key-property>
</composite-id>
<property name="className" type="string">
<column name="ClassName" length="45" not-null="true" />
</property>
<set name="students" table="student104" inverse="true" lazy="true" fetch="select">
<key>
<column name="ClassId" />
<column name="EntityId" not-null="true" />
</key>
<one-to-many class="student" />
</set>
</class>