我有2个班级,学生和课程,它们成为第三个班级的复合键,等级。
<class name="Grade" table="grade" lazy="true">
<composite-id>
<key-many-to-one class="Student" name="student" column="student_id" lazy="false" />
<key-many-to-one class="Course" name="course" column="course_id" lazy="false" />
</composite-id>
<property name="score" column="score" type="integer" />
</class>
如果我运行一个超出标准的查询,让我们说从课程中获得所有学生成绩。
DetachedCriteria dc = DetachedCriteria.forClass( Grade.class );
dc.add( Property.forName( "course" ).eq( course ) );
dc.setFetchMode( "student", FetchMode.JOIN );
List< Grade > grades = getHibernateTemplate().findByCriteria( dc );
我注意到,在.list()过程中,每个行都单独延迟加载Student对象,即使主查询也加载了学生对象。它似乎是某种关键处理,甚至没有考虑批量大小设置(我有动态批处理设置为50个批处理项目)。我找到了一个丑陋的工作。
<class name="Grade" table="grade" lazy="true">
<composite-id>
<key-property name="studentId" column="student_id" />
<key-property name="courseId" column="course_id" />
</composite-id>
<many-to-one class="Student" name="student" column="student_id" lazy="false" insert="false" update="false" />
<many-to-one class="Course" name="course" column="course_id" lazy="false" insert="false" update="false" />
<property name="score" column="score" type="integer" />
</class>
并修改Grade类以包含这些ID。有没有更好的办法?我确实想要学生和他课程对象可用(延迟加载)。使用hibernate 5.2.6。