我在一个 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=?
会发生什么?