0

学生とクラスの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>

4

1 に答える 1

0

Student のマッピングを見ると

<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>

あなたは関係を学生に挿入したり更新したりしないと言った。クラスに割り当てられた学生を変更できないと思われる場合は、update="false" insert="true"後で変更してから設定してupdate="true" insert="true"ください。また、両方の属性値はデフォルトで (マッピングから省略した場合)trueのみです。

于 2012-07-26T16:04:47.750 に答える