Hibernate顺序 - 删除行

时间:2014-07-22 19:55:48

标签: java hibernate hibernate-mapping

我的映射文件中定义了一对多的Set,当我使用order-by属性时,Set中的数据将缺少行,具体取决于我用来订购的属性。

<hibernate-mapping>
    <class name="domain.StudentUser" table="student_user" >

....

    <set name="studentCourseses" inverse="true" order-by="import_date ASC">
        <key>
            <column name="student_userid" length="15" not-null="true" />
        </key>
        <one-to-many class="domain.StudentCourses" />
    </set>
</hibernate-mapping>

public StudentUser findById(java.lang.String id) {
    log.debug("getting StudentUser instance with id: " + id);
    try {
        StudentUser instance = (StudentUser) getSession().get(
                "domain.StudentUser", id);
        return instance;
    } catch (RuntimeException re) {
        log.error("get failed", re);
        throw re;
    }
}

这里我使用import_date,但是这个表有大约15个属性,某些属性会导致Set中缺少行,而其他属性则不会。它似乎不是数据类型特定的,因为我有一个String属性的问题,但然后另一个String属性将正常工作,所有数据将在那里。无论使用哪种排序属性,它始终都是相同的行,因此它不是随机行。

大多数student_user都缺少数据,但并非全部。最终丢失的行没有任何异常,这意味着没有NULL或类似的东西。

截至目前,我刚刚删除了order-by属性,因此我可以获取我的app工作属性,但我仍然需要知道为什么会出现这些问题。到目前为止,我没有在使用order-by属性的任何其他Set中注意到这种行为,只是这个。

我正在使用Hibernate 3.5.3,如果它有用,这里是StudentCourses表的映射文件

<hibernate-mapping>
<class name="domain.StudentCourses" table="student_courses" >
    <id name="id" type="integer">
        <column name="id" />
        <generator class="native" />
    </id>
    <many-to-one name="classLevel" class="domain.ClassLevel" fetch="select">
        <column name="class_level_code" length="2" not-null="true" />
    </many-to-one>
    <many-to-one name="academicTerm" class="domain.AcademicTerm" fetch="select">
        <column name="academic_term_id" not-null="true" />
    </many-to-one>
    <many-to-one name="studentUser" class="domain.StudentUser" fetch="select">
        <column name="student_userid" length="15" not-null="true" />
    </many-to-one>
    <property name="academicYear" type="integer">
        <column name="academic_year" not-null="true" />
    </property>
    <property name="term" type="string">
        <column name="term" length="8" not-null="true" />
    </property>
    <property name="title" type="string">
        <column name="title" length="64" not-null="true" />
    </property>
    <property name="prefix" type="string">
        <column name="prefix" length="8" not-null="true" />
    </property>
    <property name="courseNum" type="string">
        <column name="course_num" length="8" not-null="true" />
    </property>
    <property name="suffix" type="string">
        <column name="suffix" length="8" />
    </property>
    <property name="sectionNum" type="string">
        <column name="section_num" length="8" />
    </property>
    <property name="units" type="double">
        <column name="units" precision="4" not-null="true" unique="true" />
    </property>
    <property name="letterGrade" type="string">
        <column name="letter_grade" length="6" not-null="true" />
    </property>
    <property name="qtrGpa" type="double">
        <column name="qtr_gpa" precision="4" scale="3" not-null="true" />
    </property>
    <property name="cumGpa" type="double">
        <column name="cum_gpa" precision="4" scale="3" not-null="true" />
    </property>
    <property name="importDate" type="timestamp">
        <column name="import_date" length="19" />
    </property>
    <property name="sourceFileName" type="string">
        <column name="source_file_name" length="128" />
    </property>
    <property name="timeStamp" type="timestamp">
        <column name="time_stamp" length="19" not-null="true">
            <comment>on update CURRENT_TIMESTAMP</comment>
        </column>
    </property>
</class>

更新(更多信息):

如果我直接查询StudentCourses表(CORRECT)与从StudentUser映射集(INCORRECT)获取StudentCourses数据给出了不同的结果,它们应匹配

for(StudentCourses course : getStudentService().retrieveStudentByID("861043440").getStudentCourseses()) {  //MISSING DATA
        System.out.println(course +" - "+course.getTerm());
    }

    for(StudentCourses course : (List<StudentCourses>)getStudentService().getStudentCoursesDAO().findByProperty("studentUser.studentUserid", "861043440")) {  //ALL DATA CORRECT
        System.out.println(course +" - "+course.getTerm());
    }

1 个答案:

答案 0 :(得分:0)

原来它与排序无关,因为调整排序只能解决一些但不是全部的问题。问题是我覆盖了StudentCourses对象的hashCode方法,并且在从StudentUser对象填充Set时导致了冲突。我修好了,一切都很好。