1
我已經在Web系統中做了一些維護,這個系統是在Java,Struts2和Hibernate 3中完成的。我的客戶迫切要求的一項是糾正登錄,因爲它非常緩慢。Hibernate運行所有表進行簡單的登錄
我可以確定用戶何時進行登錄,Hibernate會在不同表中的數據庫上生成許多與登錄無關的查詢。
我的關係有三個表:用戶,學生,教師
學生
- ID
- 名稱
教師
- ID
- 名稱
用戶
- ID
- 登錄
- 密碼
每當一個學生做一個登錄查詢檢查它是否是正確的登錄名和密碼如果ID存在於Student表中。如您所見,沒有外鍵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();
- 學生從用戶繼承...
我User.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=?
可能是什麼回事?
user.hbm中是否有多對一或bag/set/list映射?我懷疑lazyloading被意外禁用# – Firo
只有這樣,但現在我想改變做關係的方式。因爲我不明白髮生了什麼事。 – Ventura