0

以下のコードでは、cascade="save-update" が Student クラスに関連付けられた Course クラス (バッグ) に使用されます。

学生クラスは -->

    private int id;
    private String firstName;
    private String lastName;
    private Address address;
    private List<Course> courses;

コースクラスは -->

    private int id;
    private String name;
    private int unit;

Student の hbm ファイルは -->

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

<hibernate-mapping>
    <class name="pojos.Student" table="Student">

        <id name="id" type="integer" column="ID">
            <generator class="increment" />
        </id>

        <property name="firstName">
            <column name="FIRST_NAME" />
        </property>

        <property name="lastName">
            <column name="LAST_NAME" />
        </property>

        <many-to-one name="address" 
                     class="pojos.Address" 
                     column="ADDRESS_ID"
                     cascade="save-update" />

        <bag name="courses" inverse="true" cascade="save-update">
            <key column="STUDENT_ID" />
            <one-to-many class="pojos.Course" />
        </bag>

    </class>
</hibernate-mapping>

私が実行しているトランザクションは単純です-->

                    Student stud = new Student("Ketan", "Dikshit");
            Address address = new Address("Dm-Road", "Uttar Pradesh", "201301");
            Course course1 = new Course("Core Java", 101);
            Course course2 = new Course("Advanced Java", 201);

            List<Course> courses = new ArrayList<Course>();
            courses.add(course1);
            courses.add(course2);

            stud.setAddress(address);
            stud.setCourses(courses);

            try {
                tr = session.beginTransaction();
                System.out.println("\n Transaction has begun..!!");
                session.save(stud);
                tr.commit();
                System.out.println("\n Transaction is Commit..!!");
                session.close();
                System.out.println("\n Session is Closed..!!");

            } catch (Exception e) {
                System.out.println("\n Transaction is in errror..!!");
                tr.rollback();
                System.out.println("\n Transaction is RollBack..!!");
                session.close();
                System.out.println("\n Session is Closed..!!");
            }

さて、コードによると、Courses テーブルには、Course テーブルの各エントリに関連付けられた Student の主キーが含まれる「STUDENT_ID」という名前の列が保持されているはずですが、列「STUDENT_ID」にはデータが表示されていません (すべて null値が挿入されます)。

クエリ シーケンスは -->

 Transaction has begun..!!
Hibernate: select max(ID) from Student
Hibernate: select max(ID) from Address
Hibernate: select max(ID) from Course
Hibernate: insert into Address (STREET, CITY, ZIPCODE, ID) values (?, ?, ?, ?)
Hibernate: insert into Student (FIRST_NAME, LAST_NAME, ADDRESS_ID, ID) values (?, ?, ?, ?)
Hibernate: insert into Course (NAME, UNIT, ID) values (?, ?, ?)
Hibernate: insert into Course (NAME, UNIT, ID) values (?, ?, ?)

 Transaction is Commit..!!

生徒の ID を保持する代わりに、Course テーブルの列に NULL 値が表示されるのはなぜですか??

4

1 に答える 1

1

バッグ マッピングから削除inverse="true"しないと、この関係の所有者は学生ではなくコースになります。

于 2013-02-20T13:34:29.187 に答える