我的映射文件中定义了一对多的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());
}
答案 0 :(得分:0)
原来它与排序无关,因为调整排序只能解决一些但不是全部的问题。问题是我覆盖了StudentCourses对象的hashCode方法,并且在从StudentUser对象填充Set时导致了冲突。我修好了,一切都很好。