1

我在一个 web 系统上做过一些维护,这个系统是用 Java、Struts2 和 Hibernate 3 完成的。我的客户迫切要求我的一个项目是更正登录,因为它很慢。

我可以识别用户何时登录,Hibernate 在与登录无关的不同表中的数据库上生成许多查询。

我的关系是三张表:用户、学生、教师

学生

  • ID
  • 姓名

老师

  • ID
  • 姓名

用户

  • ID
  • 登录
  • 密码

每次学生登录时,查询都会检查它是否是正确的登录名和密码,以及 ID 是否存在于学生表中。如您所见,没有外键 ID,例如 Student 表中的 ID_USER。

我的查询:

Student student =(Student)session.createCriteria(Student.class)
.add( Property.forName("login").eq(login) )
.add( Property.forName("password").eq(password) )
.setMaxResults(1)
.uniqueResult();
  • 学生继承自用户...

我的用户.hbm.xml

...

<class name="com.xxx.User" table="TBL_USERS" discriminator-value="0" lazy="true">
    <id name="id" column="ID">
     <generator class="sequence">
         <param name="sequence">seq_users</param>
     </generator>
    </id>

    <discriminator column="TYPE" insert="true" />

    <subclass name="com.xxx.Student" discriminator-value="1" lazy="true">
      <join table="TBL_STUDENTS">
         <key column="ID"/>
            <property name="name" column="NAME"/>
      </join>
     </subclass>

     <subclass name="com.xxx.Teacher" discriminator-value="2" lazy="true">
        <join table="TBL_TEACHERS">
           <key column="ID" />
               <property name="name" column="NAME"  />
        </join>
     </subclass>

...

在我的 Hibernate 日志中,有许多奇怪的查询,如下所示:

它发生在 20 多个不同的表中,并且一直在重复,因为登录操作很慢。但我不知道为什么会这样,我对 Hibernate 没有太多经验。

休眠:

select
      exerc0_.ID_CLASS as ID6_1_,
      exerc0_.ID as ID1_,
      exerc0_.ID as ID14_0_,
      exerc0_.DATE_ENT as DATA2_14_0_,
        exerc0_.TITLE as TITTLE14_0_,
        exerc0_.TEXT as TEXT14_0_,
        exerc0_.TYPE_EXERC as TYPE5_14_0_,
        exerc0_.ID_CLASS as ID6_14_0_ 
    from
        TBL_EXERC exerc0_ 
    where
        exerc0_.ID_CLASS=?

会发生什么?

4

1 回答 1

0

只是不要让这个问题永远悬而未决。问题已经修复了很多次,但我完全忘记回复了。我必须启用一些延迟加载,并确保在其他几个地方选择 LIST 而不是 SET。LIST 似乎更具性能。

@Firo 在某种程度上是正确的。

于 2015-01-05T21:11:41.353 回答