Hibernate Composite键具有“key-many-to-one”关系加载性能

时间:2017-04-04 18:52:04

标签: java hibernate lazy-loading hibernate-mapping many-to-one

我有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。

0 个答案:

没有答案